"ps"가 자체 프로세스를보고하지 못하게하는 방법은 무엇입니까?


52
$ ps | grep django
28006 ttys004    0:01.12 /usr/bin/python bin/django celeryd --beat
51393 ttys005    0:01.45 /usr/bin/python bin/django celeryd -l INFO
51472 ttys005    0:01.29 /usr/bin/python bin/django celeryd -l INFO
51510 ttys005    0:01.89 /usr/bin/python bin/django celeryd -l INFO
51801 ttys005    0:01.83 /usr/bin/python bin/django celeryd -l INFO
53470 ttys005    0:03.97 /usr/bin/python bin/django celeryd -l INFO
53780 ttys005    0:00.00 grep django

마지막 프로세스 (즉, 내 ps 명령과 동시에 시작된 grep)가보고되지 않도록하는 방법이 있습니까?

(나는 리터럴과 일치하지만 자체와는 일치하지 않는 정규 표현식을 찾으려고 노력했지만 올바른 접근법이 아닌 것처럼 보입니다 ...)

답변:


14

내 답변은 ps목록 에서 "foobar"를 검색하는 일반적인 답변의 변형입니다 . 의 주장 "-A" "ps"은보다 이식성이 "aux"뛰어나지 만이 변화는 답과 관련이 없다고 생각합니다. 일반적인 대답은 다음과 같습니다.

$ ps -A -ww | grep [f]oobar

대신이 패턴을 사용합니다.

$ ps -A -ww | grep [^]]foobar

주요 장점은 [^]]원하는 패턴 으로 정적 문자열 을 연결하기 때문에이 패턴을 기반으로 스크립트를 작성하는 것이 더 쉽다 는 것입니다. 문자열의 첫 글자를 뺄 필요가 없으며 대괄호 사이에 삽입 한 다음 다시 연결하십시오. 쉘에서 스크립팅 할 때 [^]]찾고자하는 패턴 앞에 단순히 붙이는 것이 더 쉽습니다 . Bash에서 문자열 슬라이싱은 추한 일이므로 변형으로 피할 수 있습니다. 이 변형은 패턴이 앞 오른쪽 대괄호없이 일치하는 선을 보여줍니다]. 대괄호를 제외하는 검색 패턴은 실제로 대괄호를 패턴에 추가하므로 절대 일치하지 않습니다.

따라서 psgrep다음과 같이 이식 가능한 명령을 작성할 수 있습니다. 여기서는 Linux, OS X BSD 등의 차이점에 대해 약간의 여유를 두었습니다. 이것은에서 열 헤더를 추가하고 ps더 많은 사용자 정의를 제공합니다.ps내 요구에 더 적합한 형식으로, 명령 줄 인수가 누락되지 않도록 여분의 너비를 추가로 표시하는 프로세스를 표시합니다. 글쎄, 대부분은 그리워하지 않습니다. Java는 Java이기 때문에 가능한 한 최악의 방법으로 작업을 수행하므로 일부 Java 서비스는 프로세스 테이블에서 추적 할 수있는 최대 허용 길이의 인수를 초과하여 실행됩니다. 나는 이것이 1024 자라고 생각합니다. 프로세스를 시작하는 데 허용되는 명령 단독 길이는 훨씬 길지만 커널 프로세스 테이블은 1K 이상의 길이를 추적하지 않습니다. 명령이 시작되면 command-name 및 argument list가 필요하지 않으므로 프로세스 테이블에 저장되는 것은 정보 용입니다.

psgrep ()
{
    pattern=[^]]${1};
    case "$(uname -s)" in
        Darwin)
            ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        Linux)
            ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        *)  # other UNIX flavors get a minimalist version.
            ps -A -ww | grep -i -e ${pattern}
        ;;
    esac
}

단점은 이것이 원래 패턴보다 실제로 하나의 문자보다 앞에 일치한다는 것입니다. 예를 들어 PID와 일치하지 않습니다. 와 함께 사용하면 약간 오해의 소지가 grep --colour있습니다.
Tonin

67

@jamzed terse answer의 경우 +1이지만 OP에는 설명이 필요할 수 있습니다.

ps | grep "[d]jango"

그 정규식을 사용하여 당신은 PS 문자열이 정규 표현식 일치하기 때문에, 자신을 일치하지 않습니다 프로세스 시작하는 "django"하지를 "[d]jango". 이렇게하면 문자열 "[d] jango"가있는 프로세스를 제외 할 것입니다.이 경우 grep입니다. pgrep, egrep, awk, sed 등에 적용 할 수 있습니다. 정규식을 정의하는 데 사용한 명령 중 하나입니다.

남자 7 정규식에서

   A bracket expression is a list of characters enclosed in "[]".  It nor‐
   mally matches any single character from the list (but see  below).   If
   the  list  begins  with  '^',  it matches any single character (but see
   below) not from the rest of the list.  If two characters  in  the  list
   are  separated  by '-', this is shorthand for the full range of charac‐
   ters between those two (inclusive) in the collating sequence, for exam‐
   ple,  "[0-9]" in ASCII matches any decimal digit.  It is illegal(!) for
   two ranges to share an endpoint, for example, "a-c-e".  Ranges are very
   collating-sequence-dependent,  and portable programs should avoid rely‐
   ing on them.

2
시원한. 나는 실제로 정규 표현식에 꽤 익숙하지만 정규 표현식과 일치하는 것을 즉시 막을 방법을 생각할 수 없었습니다. 대괄호로 문자를 묶는 것이 완벽합니다. ([^!]와 같은 것을 포함해도 효과가 있습니다 ...)
Steve Bennett

1
멋지고 교묘합니다.
ash

'ps'특정 사례의 경우, 검색중인 프로세스 이름 앞에 '[]'를 사용합니다. 그런 다음 정규 표현식의 프로세스 이름을 특별히 구문 분석 할 필요는 없지만 여전히 일치합니다.
Neromancer

@hmontoliu 예를 들어 작동하지 않습니다 : ps aux | grep [s]cript1. 솔루션에 대해 언급하는 데 도움이 될 수 있습니까?
SOUser

@hmontoliu 내 잘못이다. 이전 검색으로 인해 해당 라인이 표시되는 것 같습니다 ...
SOUser

30

ps | grep [d]jango

ps | grep d[j]ango

...

ps | grep djang[o]


하나의 문자를 grep해야 할 경우 공간을 추가하십시오.ps aux| grep "[Z] "
AD

@jamzed 예를 들어 작동하지 않습니다 : ps aux | grep [s]cript1또는 ps aux | grep [s]cript2. 그렙 라인이 여전히 표시됩니다. 솔루션에 대해 언급하는 데 도움이 될 수 있습니까?
SOUser

@jamzed 내 잘못. 이전 검색으로 인해 해당 라인이 표시되는 것 같습니다 ...
SOUser

18

대신 pgrep을 사용하십시오 : pgrep -lf django


평소와 같이 플랫폼 (이 경우 OS X)을 언급하는 것을 잊었습니다. 아마도 pgrep는 다양한 리눅스에서 작동합니다.
Steve Bennett

동의하지 않습니다, @ramruma. 나 pgrep에게이 문제를 정확하게 알려 주기 때문에이 스레드에 정확하게 왔습니다 . 그러나 CygWin ( ps프로세스의 전체 명령 줄을 표시 할 수없는 곳)에서 테스트하고 있다고 말해야합니다 .
Sopalajo de Arrierez

매뉴얼에 "실행중인 pgrep 또는 pkill 프로세스는 절대로 일치하는 것으로보고되지 않습니다."라고 말하지만 실제로는 그렇게 보지 못했습니다.
deltab

방금 pgrep일치 한다고 생각하는 문제를 방금 처리했습니다 . bash내가 실행중인 스크립트 파일 의 이름과 일치하는 것으로 나타났습니다 . 추가 -x하면 명령 이름과 정확히 일치합니다.
andynormancx

11

아 잠깐만, 이것은 작동합니다 :

ps | grep django | grep -v grep

7
프로세스 명령 줄에 합법적으로 포함하지 않는 경우에만 grep일반적인 경우에는 의지 할 수 없습니다.
CVn

8

ps -d | grep django

남자 PS에서 :

 -d                  Lists information  about  all  processes
                     except session leaders.

아직도 내 욕심을 보여줍니다 ...
Kevin

네, OS X에서 저에게 효과적입니다.
Steve Bennett

Linux에서는 잘 작동하지 않습니다.
Acumenus

보다 일반적으로 ps이식성이 좋지 않은 옵션 은 이것이 어떤 플랫폼인지에 대한 정보가 없으면 도움이되지 않습니다. 또한 찾고있는 프로세스가 프로세스 리더가 아닌지 확실하지 않은 경우에는이 방법이 적합하지 않습니다 (예 : 대상이 데몬 인 경우에는 도움이 될 수 있지만 일반적으로 그렇지 않은 경우).
tripleee

재미 있고, Mac에서는 이것은 grep 프로세스 만을 보여주고 다른 모든 것을 걸러내는 것 같습니다.
Christopher Hunter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.