어떤 상황에서 pgrep -x가 유효한 pid를 반환하지 못합니까?

어떤 상황에서 pgrep -x가 유효한 pid를 반환하지 못합니까?

실행 중인 애플리케이션이 있습니다.

$ ps -ef | grep hello_world
steve     9607  1816  0 09:11 ?        00:00:00 ./hello_world
steve    10093 21566  0 09:18 pts/4    00:00:00 grep hello_world

pgrep -f패턴을 사용하여 pid를 검색 할 수 있습니다.

$ pgrep -f ./hello_world
9607
$ echo $?
0

$ pgrep -f hello_world
9607
$ echo $?
0

그러나 다음을 사용하여 pgrep -x검색 하면정밀한패턴 일치, 아무것도 반환하지 않음

$ pgrep -x ./hello_world
$ echo $?
1

$ pgrep -x hello_world
$ echo $?
1

/proc파일 시스템에서 정확한 명령줄을 확인하면 다음이 반환됩니다.

$ cat /proc/9607/cmdline
./hello_world

나는 왜 pgrep -x실패하는가?

답변1

$ pgrep -x ./hello_world
$ echo $?
1

첫 번째 표현식이 일치하지 않는 이유는 정확한 프로세스 이름 일치( 예제에 pgrep프로세스 이름이 있음)를 찾 도록 요청했지만 검색 문자열을 제공했기 때문입니다.hello_world./hello_world

$ pgrep -x hello_world
$ echo $?
1

두 번째 검색이 왜 효과가 없는지 모르겠습니다. Ubuntu 14.04용이므로 게시물에 일종의 버그가 있거나 최신 버전에 버그가 있습니다.

$ ./dd &
[1] 6377
$ pgrep -x dd
6377

답변2

procps 및 정규식 일치 구현이 pgrep -x손상된 것 같습니다.

$ /bin/sleep 9& pgrep -x 'sleep'
[1] 8472
8472
$ /bin/sleep 9& pgrep '^sleep$'
[2] 8485
8472
8485
$ 

맨페이지를 읽어보니 둘 다 null을 반환해야 합니다.

그것에 대해 생각해보세요 pidof.


사람들이 래퍼 스크립트를 제외하려는 성가신 상황이 있습니다. 이 경우에는 다음과 같은 상황이 발생합니다 sleep.

#!//bin////bash
echo "Script PID: $$"
/bin/sleep 1&
pgrep -ax sleep

출력은 다음과 같습니다

Script PID: 12973                              
12973 //bin////bash ./sleep                    
12974 /bin/sleep 1 

관련 정보