В чем разница между pidof и pgrep?

12

Когда я использую любую из этих команд с аргументом в качестве имени процесса, обе они возвращают одно и то же число. Это те же команды? Это две разные команды, которые делают одно и то же? Является ли один из них псевдонимом другого?

pidof firefox
pgrep firefox
галактика
источник

Ответы:

18

Программы 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
Лиса
источник
3

Фокс упомянул, что pgrepвыполняет поиск с использованием регулярных выражений, пока pidofнет.

Но pgrepтакже есть гораздо больше вариантов:

  • С -u "$UID"вами могут совпадать только процессы, принадлежащие текущему пользователю.
  • С --parentего помощью можно найти дочерние процессы данного процесса.
  • Вы можете выбрать --oldestили --newestиз соответствующих процессов.
  • ... и другие, перечисленные на странице руководства ...

Давайте выясним, к какому пакету относится каждый процесс (в системах apt):

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

$ dpkg -S "$(which pgrep)"
procps: /usr/bin/pgrep
joeytwiddle
источник