Jaka jest różnica między pidof a pgrep?

13

Kiedy używam jednego z tych poleceń z argumentem jako nazwą procesu, oba zwracają dokładnie ten sam numer. Czy są to te same polecenia? Czy są to dwa różne polecenia, które robią to samo? Czy jeden z nich jest pseudonimem drugiego?

pidof firefox
pgrep firefox
Galaktyka
źródło

Odpowiedzi:

18

Programy pgrepi pidofnie są dokładnie tym samym, ale są bardzo podobne. Na przykład:

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

Jak widać, pidofnie udało się znaleźć dopasowania [i]ref. Jest tak, ponieważ pidof programzwraca listę wszystkich identyfikatorów procesów powiązanych z programem o nazwie program. Z drugiej strony pgrep rezwraca listę wszystkich identyfikatorów procesów powiązanych z programem, którego nazwa jest zgodna z wyrażeniem regularnym re.

W najbardziej podstawowych formach równoważność jest w rzeczywistości:

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

Jako kolejny konkretny przykład rozważ:

$ 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
Lis
źródło
4

Fox wspomniał, że pgrepwyszukuje za pomocą wyrażeń regularnych, podczas gdy pidofnie.

Ale pgrepma też o wiele więcej dostępnych opcji:

  • Dzięki -u "$UID"możesz dopasować tylko procesy należące do bieżącego użytkownika.
  • Dzięki --parentniemu możesz znaleźć procesy potomne danego procesu.
  • Możesz wybrać --oldestlub --newestspośród pasujących procesów.
  • ... i różne inne wymienione na stronie podręcznika ...

Dowiedzmy się, do którego pakietu należy każdy proces (w systemach apt):

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

$ dpkg -S "$(which pgrep)"
procps: /usr/bin/pgrep
joeytwiddle
źródło