Відповіді:
Програми pgrep
і pidof
не зовсім одне і те ж, але вони дуже схожі. Наприклад:
$ pidof 'firefox'
5696
$ pgrep '[i]ref'
5696
$ pidof '[i]ref'
$ printf '%s\n' "$?"
1
Як бачите, pidof
не вдалося знайти відповідність для [i]ref
. Це тому, що pidof program
повертає список усіх ідентифікаторів процесів, пов'язаних з програмою, що називається program
. З іншого боку, pgrep re
повертає список усіх ідентифікаторів процесів, пов'язаних з програмою, ім'я якої відповідає звичайному виразу 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
Фокс згадував, що pgrep
пошук використовує регулярні вирази, поки pidof
це не робить.
Але pgrep
також доступно набагато більше варіантів:
-u "$UID"
вами можна співставити лише процеси, що належать поточному користувачеві.--parent
вас можна знайти дочірні процеси певного процесу.--oldest
або --newest
відповідні процеси.Давайте з’ясуємо, до якого пакету належить кожен процес (у підхожих системах):
$ dpkg -S "$(which pidof)"
sysvinit-utils: /bin/pidof
$ dpkg -S "$(which pgrep)"
procps: /usr/bin/pgrep