왜“ps aux | grep x”가“pgrep x”보다 더 나은 결과를 제공합니까?


82

우분투에서 다음 명령을 시도했지만 아무것도 표시되지 않습니다.

pgrep php5

php5의 프로세스 ID를 반환해서는 안됩니다 (다음 명령이 수행하는 것) ?:

ps aux | grep php5

그렇다면이 두 명령의 차이점은 무엇입니까?

답변:


75

ps aux전체 명령 행 (경로 및 매개 변수)을 포함하고 pgrep 은 실행 파일 이름 의 처음 15 자만 찾습니다.

ps auxpgrep실행 파일 이름 만 확인 하면서 각 프로세스의 전체 명령 줄을 반환합니다 .

이는 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

3
"pgrep을 -l"도 아마 버그가 있지만, 나이를 위해 다음과 같이되어있는, 15 자 과정을 자릅니다
THORSEN

1
잘은 2008 업스트림 버그로 런치 패드에 있어요 :) "상단과 PS 잘라 내기 명령 후 15 개 문자" bugs.launchpad.net/ubuntu/+source/procps/+bug/295876
THORSEN

2
Hah, 이것은 주석 # 3에서 설명합니다 : 이것은 procs의 일부 프로 시저가에서 명령 이름을 /proc/<pid>/stat얻지 못하기 때문입니다/proc/<pid>/cmdline . 좋아, @Thorsen, 당신은 버그 스프레이 승리, 그것은 버그입니다 : P
ish

2
@xczzhh pgrep는 부당한 명령이 아닙니다. 잘 설계된대로 작동합니다. 문제는 단순히 실행할 때 옵션이 누락 pgrep되었다는 것입니다. 사용하는 ps aux | grep xxx것은 신뢰할 수 없으므로 grep출력에서 자체 를 필터링하기 위해 해킹이 필요 하며와 같이 잘못된 긍정을 줄 수 있습니다 ps aux | grep root.
jlliagre

1
이 반 마약 상업해야한다, bash는 도구의 제작자 그래서 그들은이 같은 일이 잘 설계된 생각 LSD에 뭐래했다
앤디 레이

78

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

3
pid뿐만 아니라 전체 명령 행을 보려면 -a( --list-full) 옵션을 추가 하십시오. (이전 pgrep을이없는 한 -a, 이에했다-fl .)
베니 Cherniavsky-Paskin

1
원래의 질문은 그 차이에 대해 묻고 있었지만 이것은 실제로 우리들에게 pgrep해결책을 훌륭하게 시도하려고합니다 . +1
2rs2ts

@ 2rs2ts 감사합니다. 질문에 대한 답변이 없습니다. 지금 수정했습니다.
jlliagre 2016 년

프로그램 /proc/self/cmdline이 "설명 적"으로 수정 되는 경우가 있습니다 pgrep -fa ruby. puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker]"멍청한" pgrep -a ruby것입니다. 후자가 바보인지 확실하지 않습니다.
Beni Cherniavsky-Paskin

@ BeniCherniavsky-Paskin 나는 그것이 모두에 적용하기 때문에 즉, 질문에 대한 코멘트 수 있었다 생각 pgrep하고 ps.
Franklin Yu

3
diff <(ps aux|grep x) <(pgrep x) # :)

12
이 질문에 대한 답을 얻을 수도 있지만 답을 확장하여이 한 줄 명령의 기능을 설명 할 수도 있습니다.
fossfreedom

1

현재 pgrep가 처음 4,096 자로 제한되어 있기 때문에 (보다 긴 클래스 경로를 가진 Java 프로그램의 엔트리 클래스를 찾는 Java 사용자에게 영향을 미치기 ps때문에)보다 완전한 출력 pgep -f을 제공합니다. 이를 추적하는 버그는 다음과 같습니다. https://gitlab.com/procps-ng/procps/issues/86


이것을 영원히 찾았습니다.
tresf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.