pidof와 pgrep의 차이점은 무엇입니까?

pidof와 pgrep의 차이점은 무엇입니까?

인수를 프로세스 이름으로 사용하여 이러한 명령을 사용하면 모두 정확히 동일한 숫자를 반환합니다. 같은 명령인가요? 동일한 작업을 수행하는 두 개의 다른 명령입니까? 하나는 다른 하나의 별칭입니까?

pidof firefox
pgrep firefox

답변1

이러한 프로그램 pgrep과 절차는 pidof완전히 동일하지는 않지만 매우 유사합니다. 예를 들어:

$ pidof 'firefox'
5696
$ pgrep '[i]ref'
5696
$ pidof '[i]ref'
$ printf '%s\n' "$?"
1

보시다시피 pidof일치하는 항목이 없습니다 [i]ref. 이는 pidof program이름이 지정된 프로그램과 관련된 모든 프로세스 ID 목록이 반환되기 때문입니다 program. 반면, pgrep re이름이 정규식과 일치하는 프로그램과 관련된 모든 프로세스 ID 목록을 반환합니다 re.

가장 기본적인 형태로 보면 실제로는 다음과 같습니다.

$ pidof 'program'
$ pgrep '^program$'

또 다른 구체적인 예로 다음을 고려해보세요.

$ ps ax | grep '[w]atch'
   12 ?        S      0:04 [watchdog/0]
   15 ?        S      0:04 [watchdog/1]
   33 ?        S<     0:00 [watchdogd]
18451 pts/5    S+     0:02 watch -n600 tail log-file
$ pgrep watch
12
15
33
18451
$ pidof watch
18451

답변2

pgrepFox는 검색을 위해 정규식을 사용한다고 언급 하지만 while은 pidof그렇지 않습니다.

하지만 pgrep더 많은 옵션을 사용할 수 있습니다.

  • -u "$UID"현재 사용자에게 속한 프로세스만 일치시킬 수 있습니다 .
  • 이를 사용하여 --parent특정 프로세스의 하위 프로세스를 찾을 수 있습니다.
  • --oldest일치하는 프로세스를 하나 이상 선택할 수 있습니다 --newest.
  • ...그리고 매뉴얼 페이지에 나열된 다양한 다른 것들...

적절한 시스템에서 각 프로세스가 어떤 패키지에 속하는지 알아 보겠습니다.

$ dpkg -S "$(which pidof)"
sysvinit-utils: /bin/pidof

$ dpkg -S "$(which pgrep)"
procps: /usr/bin/pgrep

팩맨 시스템에서:

$ pacman -Qo "$(which pidof)"
/usr/bin/pidof is owned by procps-ng 3.3.17-1

$ pacman -Qo "$(which pgrep)"
/usr/bin/pgrep is owned by procps-ng 3.3.17-1

RPM 시스템의 경우:

$ rpm -qf "$(which pidof)"
... ?

답변3

참고: pidof마지막 슬래시 이후의 모든 내용을 고려할 수 있습니다 program name.

fang@debian:~$ ps -ax | grep k3s | head -n1
    528 ?        Ssl  634:37 /usr/local/bin/k3s server
fang@debian:~$ pgrep k3s
528
fang@debian:~$ pidof k3s
fang@debian:~$ pidof /usr/local/bin/k3s
fang@debian:~$ pidof '/usr/local/bin/k3s server'
528
fang@debian:~$ pidof 'k3s server'
528

업데이트: Stéphane Chazelas가 말했듯이 pidof실제로성냥어느:

  • Name:필드는/proc/pid/status
  • 첫 번째 매개변수/proc/pid/cmdline
  • 첫 번째 매개변수의 기본 이름/proc/pid/cmdline

대부분의 경우 각 arg 뒤에 하나씩 있어야 합니다 NUL. 예를 들어. 잠:

fang@debian:~$ sleep infinity &
[1] 2076966
fang@debian:~$ pidof sleep
2076966
fang@debian:~$ xxd /proc/2076966/cmdline
00000000: 736c 6565 7000 696e 6669 6e69 7479 00    sleep.infinity.
fang@debian:~$ head -n1 /proc/2076966/status
Name:   sleep

argv[0]공백이 포함되어 있기 때문에 조금 특별합니다 .

fang@debian:~$ ls -l /usr/local/bin/k3s
-rwxr-xr-x 1 root root 54001664  7月  3 20:16 /usr/local/bin/k3s
fang@debian:~$ head -n1 /proc/528/status
Name:   k3s-server
fang@debian:~$ head -n1 /proc/528/cmdline && echo
/usr/local/bin/k3s server
fang@debian:~$ xxd /proc/528/cmdline 
00000000: 2f75 7372 2f6c 6f63 616c 2f62 696e 2f6b  /usr/local/bin/k
00000010: 3373 2073 6572 7665 7200 0000 0000 0000  3s server.......

요약하면, pid를 얻으려면 다음을 수행할 수 있습니다.

fang@debian:~$ pgrep k3s-server
528
fang@debian:~$ pidof k3s-server
528
fang@debian:~$ pidof 'k3s server'
528

당신은 할 수 없습니다:

fang@debian:~$ pgrep 'k3s server'

왜냐하면 그것만 일치하기 때문이다.

  • Name:필드는/proc/pid/status
  • (...)(내부 부품도 마찬가지인 것 같죠 /proc/pid/stat?)

관련 정보