답변:
ps aux
전체 명령 행 (경로 및 매개 변수)을 포함하고 pgrep 은 실행 파일 이름 의 처음 15 자만 찾습니다.ps aux
pgrep
실행 파일 이름 만 확인 하면서 각 프로세스의 전체 명령 줄을 반환합니다 .
이는 grepping ps aux
출력이 프로세스 바이너리 경로 또는 매개 변수에서 발생하는 모든 것과 일치 한다는 것을 의미합니다 .
ps aux | grep php5
일치합니다 /usr/share/php5/i-am-a-perl-script.pl
pgrep php5
하지 않습니다내 시스템에서 예를 들어 보자. 대신 우리는 파이썬을 사용할 것이다 php5
.
ps aux | grep python
우리에게 주어지다:izx 2348 0.0 0.7 514928 15644? SL Jun24 0:00 / usr / bin / python / usr / lib / unity-lens-video / unity-lens-video izx 2444 0.0 0.9 547392 18864? SL Jun24 0:01 / usr / bin / python / usr / lib / unity-scope-video-remote / unity-scope-video-remote 루트 2805 0.0 0.5 95436 12204? S Jun24 0:00 / usr / bin / python / usr / lib / system-service / system-service-d izx 6272 0.0 2.9 664400 60320? SNl Jun24 1:16 / usr / bin / 파이썬 / usr / bin / update-manager --no-focus-on-map 루트 11729 0.0 0.9 180508 19516? S Jun25 0:00 파이썬 / usr / lib / software-properties / software-properties-dbus
pgrep python
만 반환합니다 11729
.루트 11729 0.0 0.9 180508 19516? S Jun25 0:00 파이썬 / usr / lib / software-properties / software-properties-dbus
/proc/<pid>/stat
얻지 못하기 때문입니다/proc/<pid>/cmdline
. 좋아, @Thorsen, 당신은 버그 스프레이 승리, 그것은 버그입니다 : P
pgrep
는 부당한 명령이 아닙니다. 잘 설계된대로 작동합니다. 문제는 단순히 실행할 때 옵션이 누락 pgrep
되었다는 것입니다. 사용하는 ps aux | grep xxx
것은 신뢰할 수 없으므로 grep
출력에서 자체 를 필터링하기 위해 해킹이 필요 하며와 같이 잘못된 긍정을 줄 수 있습니다 ps aux | grep root
.
이 ps aux | grep x
명령은 pgrep x
본질적으로 후자의 옵션이 없기 때문에 "보다 나은"결과를 제공합니다 .
기본 동작 인 프로세스 이름뿐만 아니라 전체 명령 행을 검색하기 -f
위한 옵션을 사용하면 pgrep
됩니다. 예 :
pgrep -f php5
선 ps | grep
을 걸러 내거나 grep
패턴 트릭을 사용해야 하는 구성과 달리 pgrep
디자인에 따라 선택되지 않습니다.
또한 패턴이 ps
USER
열에 나타나면 출력에서 원치 않는 프로세스가 pgrep
발생 하고이 결함으로 고통받지 않습니다.
pid 대신 전체 세부 정보를 원하면 다음을 사용할 수 있습니다.
ps wup $(pgrep -f python)
보다 간단하고 신뢰할 수있는
ps aux | grep python | grep -v grep
또는
ps aux | grep p[y]thon
pgrep
해결책을 훌륭하게 시도하려고합니다 . +1
/proc/self/cmdline
이 "설명 적"으로 수정 되는 경우가 있습니다 pgrep -fa ruby
. puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker]
"멍청한" pgrep -a ruby
것입니다. 후자가 바보인지 확실하지 않습니다.
pgrep
하고 ps
.
diff <(ps aux|grep x) <(pgrep x) # :)
현재 pgrep가 처음 4,096 자로 제한되어 있기 때문에 (보다 긴 클래스 경로를 가진 Java 프로그램의 엔트리 클래스를 찾는 Java 사용자에게 영향을 미치기 ps
때문에)보다 완전한 출력 pgep -f
을 제공합니다. 이를 추적하는 버그는 다음과 같습니다. https://gitlab.com/procps-ng/procps/issues/86