Der unbekannte Befehl – „pidof“, „pkill“, „pgrep“ die Prozessbeherrscher

In diesem Teil fasse ich gleich drei Befehle zusammen da sie von der Funktion her sehr verwandt sind. Alle diese Befehle sind für das Verwalten und Kontrolle von Prozessen mit Hilfe des Prozessnamens zuständig. Intern werden Prozesse über die PID (process identifier) verwaltet – eine mehr oder minder vom Betriebssystem zufällige aber zum aktuellen Zeitpunkt einmalig vergebene Prozessnummer. Wenn man sich mit ps die Prozesse anzeigen lässt erhält man neben anderen Informationen auch die Prozessnummer:

$ ps aux | grep sshd
root 974 0.0 0.0 15948 1248 ? Ss Jul09 0:00 /usr/sbin/sshd -D
max 15984 0.0 0.0 6088 892 pts/6 S+ 18:07 0:00 grep sshd

Der Übersichtlichkeit wurde hier im Beispiel nach dem Prozess für den ssh-Daemon (sshd) mit den Optionen für alle Prozesse gesucht. Die PID 974 steht hier für den Daemon und 15984 für den Suchprozess selber. Auch top, htop usw. eignen sich für die Anzeige der PID.

Linux bzw. die Shell bietet aber mit pidof ein einfacheres Mittel um diese Information zu erhalten:

$ pidof sshd
974

pidof ist eine simple Abfrage nach der PID eines benannten Prozesses. Wenn ein gleichnamiger Prozess mehrfach gestartet ist dann gibt pidof mehrere PIDs zurück.

$ pidof firefox-esr
7929 5506 3585 3080 3035 3000 2914 2710 2495 2375

Man kann hier jedoch nicht sagen welche PID zu genau welcher Instanz gehört. Nun kann man sich jetzt sagen: „cool dann kann ich ja einen Prozess den ich vorher beendet habe indem ich mir mit ps die PID geholt habe mit kill $(pidof <Prozessname>) beenden und muss mir diese dämliche PID nicht merken“. Stimmt aber das ist umständlich denn dazu wurde das nächste Kommando pkill geschaffen. kill beendet einen Prozess anhand seiner PID aber pkill anhand seines Namens. Wenn eine Instanz von kate (dem Editor von KDE) läuft so beendet pkill den Prozess ohne weitere Rückmeldung:

$ pidof kate
16139
$ pkill kate
$

Wenn mehrere Prozesse mit dem gleichen Namen vorhanden sind werden auch alle beendet. Auf diese Art und Weise werden alle Prozesse beendet die den Suchbegriff im Namen haben. Durch die Option -x kann man jedoch einschränken, dass nur die Prozesse beendet werden die exakt diesen Namen tragen. Es würde beispielsweise zwischen sshd und ssh unterschieden – also zwischen Daemon und Client. Nützlich sind auch noch die Optionen -u <Benutzername oder UID) die nur die Prozesse eines Benutzers berücksichtigt und die Optionen -n bzw. -o die den jeweilig neusten oder ältesten Prozess beendet. Wie auch bei dem Befehl kill wird als Standard das Signal SIGTERM (15) gesendet. Andere Signale wie z.B. USR1 können jedoch als Option übergeben werden.

pgrep ist eine Mischung aus pidof und pkill. Es gibt beim Aufruf mit einem Prozessnamen wie pidof die PID zurück beherrscht aber eher den Syntax von pkill. pgrep kann jedoch keine Prozesse beenden sondern informiert nur über die PID. pgrep kennt im Gegensatz zu pidof eine ganze Reihe an Optionen und ist dadurch deutlich komplexer. Die wichtigsten Optionen entsprechen denen von pkill. Man kann mit pgrep statt einem Prozessnamen beispielsweise auch /bin mit der Option -f angeben und erhält damit alle laufenden Prozesse die aus dem Verzeichnis /bin und dessen Unterverzeichnissen gestartet werden. Die Option -l gibt beim Aufruf auch den Prozessnamen hinter der PID zurück und mit der Option -u <Benutzernamen oder UID> kann man wie bei pkill auch wieder nach Prozessen eines Benutzers suchen.

kais-universum.de