인수를 프로세스 이름으로 사용하여 이러한 명령을 사용하면 모두 정확히 동일한 숫자를 반환합니다. 같은 명령인가요? 동일한 작업을 수행하는 두 개의 다른 명령입니까? 하나는 다른 하나의 별칭입니까?
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
pgrep
Fox는 검색을 위해 정규식을 사용한다고 언급 하지만 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
?)