Was ist der Unterschied zwischen pidof und pgrep?

12

Wenn ich einen dieser Befehle mit einem Argument als Namen eines Prozesses verwende, geben beide genau dieselbe Nummer zurück. Sind sie die gleichen Befehle? Sind es zwei verschiedene Befehle, die dasselbe tun? Ist einer von ihnen ein Pseudonym für den anderen?

pidof firefox
pgrep firefox
Galaxis
quelle

Antworten:

18

Die Programme pgrepund pidofsind nicht ganz dasselbe, aber sie sind sehr ähnlich. Beispielsweise:

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

Wie Sie sehen können, pidofkonnte keine Übereinstimmung für gefunden werden [i]ref. Dies liegt daran, dass pidof programeine Liste aller Prozess-IDs zurückgegeben wird, die einem aufgerufenen Programm zugeordnet sind program. Gibt andererseits pgrep reeine Liste aller Prozess-IDs zurück, die einem Programm zugeordnet sind, dessen Name mit dem regulären Ausdruck übereinstimmt re.

In ihren grundlegendsten Formen ist die Äquivalenz tatsächlich:

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

Betrachten Sie als weiteres konkretes Beispiel:

$ 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
Fuchs
quelle
3

Fox hat erwähnt, dass pgrepSuchen mit regulären Ausdrücken, während pidofdies nicht der Fall ist.

Hat aber pgrepauch viel mehr Möglichkeiten zur Verfügung:

  • Mit können -u "$UID"Sie nur Prozesse abgleichen, die zum aktuellen Benutzer gehören.
  • Mit --parentkönnen Sie die untergeordneten Prozesse eines bestimmten Prozesses finden.
  • Sie können das --oldestoder --newestdes Matching-Prozesses auswählen .
  • ... und verschiedene andere auf der Manpage aufgelistete ...

Lassen Sie uns herausfinden, zu welchem ​​Paket jeder Prozess gehört (auf apt-Systemen):

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

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