관련 문제를 디버깅하는 동안 pgrep이 다음과 같이 임의적인 것처럼 보이는 명령줄 모드에 대해 PID를 반환하는 것을 발견했습니다.
$ sudo pgrep -f "asdf"
13017
$ sudo pgrep -f ";lkj"
13023
$ sudo pgrep -f "qwer"
13035
$ sudo pgrep -f "poiu"
13046
$ sudo pgrep -f "blahblahblah"
14038
$ sudo pgrep -f "$(pwgen 16 1)"
14219
sudo가 없는 동일한 명령은 예상대로 아무것도 반환하지 않습니다.
$ pgrep -f blahblahblah
명령이 무엇인지 확인하기 위해 PID를 ps로 파이핑하려고 시도했지만 작동하지 않았습니다.
$ sudo pgrep -f blahblahblah | xargs ps -f -p
UID PID PPID C STIME TTY TIME CMD
프로세스가 너무 빨리 종료된 것 같습니다. 그런 다음 ps와 grep을 사용해 보았으나 작동하지 않았습니다(즉, 결과 없음).
$ sudo ps -e -f | grep [a]sdf
$ sudo ps -e -o command | grep asdf
grep asdf
또한 명령을 충분히 빠르게 다시 실행하면 PID가 꾸준히 상승하는 것으로 나타났습니다.
$ for i in $(seq 1 10); do sudo pgrep -f $(pwgen 4 1); done
14072
14075
14078
14081
14084
14087
14090
14093
14096
14099
$ for i in $(seq 1 10); do sudo pgrep -f blahblahblah; done
13071
13073
13075
13077
13079
13081
13083
13085
13087
13089
온전한지 확인하기 위해 find 및 grep을 사용하여 proc 디렉토리 검색을 시도했습니다.
$ sudo find /proc/ -regex '/proc/[0-9]+/cmdline' -exec grep adsfasdf {} \;
Binary file /proc/14113/cmdline matches
Binary file /proc/14114/cmdline matches
$ sudo find /proc/ -regex '/proc/[0-9]+/cmdline' -exec grep adsfasdf {} \;
Binary file /proc/14735/cmdline matches
Binary file /proc/14736/cmdline matches
PID가 다시 상승하는 것 같고 cmdline이 모든 문자열과 일치합니다.
CentOS 6.7 및 Ubuntu 12.04에서 시도했지만 동일한 결과를 얻었습니다. Mac에서 유사한 실험을 시도했을 때 테스트 결과는 음성으로 나타났습니다. 신비한 과정은 없었습니다.
여기서 무슨 일이 일어나고 있는 걸까요?
답변1
즉 , PID는 sudo
실행 중인 명령 sudo
의 상위 프로세스 PID 입니다 . 전체 명령줄을 검색하면 문자열(패턴)도 원시 부분 이므로 프로세스 가 출력에 나타 납니다. 명령의.pgrep
sudo
-f
sudo
sudo
-l
and -a
(지원하는 경우 )를 사용하면 pgrep
더 나은 아이디어를 얻을 수 있습니다 .
시험:
% sudo pgrep -af "asdf"
4560 sudo pgrep -af asdf
% sudo pgrep -lf "asdf"
4562 sudo
% pgrep -af "asdf"
%
답변2
sudo
"-f"로 검색하는 문자열이 ps
sudo의 전체 목록 에도 있기 때문에 명령을 찾고 있습니다 .
기본적으로 달릴 때는 sudo pgrep -f xyz
달립니다.
PID1 sudo pgrep -f xyz
PID2 pgrep -f xyz
pgrep 명령은 둘 다 찾아 자신을 무시하고 PID1을 일치하는 것으로 보고합니다.
sudo
실행될 때마다 새로운 명령이 나오므로 PID는 자연스럽게 증가하게 됩니다 !