So beenden Sie Prozesse über das Linux-Terminal

Manchmal ist das Beenden eines laufenden Prozesses der einzige Ausweg, um ein Problem zu lösen. Der Begriff „killen“ mag zwar drastisch klingen, bedeutet aber lediglich, einen Prozess zum sofortigen Beenden zu zwingen. Im Folgenden wird erläutert, wie man dies in der Linux- oder macOS-Befehlszeile bewerkstelligt.

Was genau ist ein Prozess?

Prozesse sind im Grunde die Ausführungen von Programmen. Dazu gehören beispielsweise Ihr Webbrowser, Hintergrundanwendungen, die Teil Ihrer Desktopumgebung sind, und Systemdienste von Linux.

Man kann Prozesse in zwei Kategorien unterteilen:

Vordergrundprozesse: Diese werden direkt vom Benutzer gestartet, entweder in einem Terminalfenster oder als grafische Anwendung.

Hintergrundprozesse: Diese laufen automatisch im Hintergrund und erfordern keine Interaktion mit dem Benutzer. Sie nehmen keine Eingaben entgegen und geben auch keine direkten Ergebnisse aus. Hierzu zählen Dienste und Daemons.

Um es bildlich auszudrücken: Vordergrundprozesse sind wie die Schauspieler auf der Bühne, während Hintergrundprozesse die Crew „hinter den Kulissen“ sind.

Wenn Prozesse fehlerhaft sind oder nicht richtig funktionieren, können sie zu viel CPU-Leistung beanspruchen, den Arbeitsspeicher überlasten oder in einer endlosen Schleife festhängen, was zu einem Nicht-Reagieren führt. Grafische Anwendungen reagieren dann möglicherweise nicht mehr auf Mausklicks, und Terminalanwendungen kehren nicht zur Eingabeaufforderung zurück.

Der „humane“ Ansatz

Das „Killen“ eines Prozesses bedeutet, ihn zum Beenden zu zwingen. Dies kann notwendig sein, wenn ein Prozess nicht mehr reagiert.

Linux stellt hierfür die Befehle kill, pkill und killall bereit. Diese können für alle Arten von Prozessen genutzt werden, ob grafisch oder in der Befehlszeile, im Vorder- oder Hintergrund.

Der kill-Befehl

Um den Befehl kill zu nutzen, benötigen Sie die Prozess-ID (PID) des Prozesses, den Sie beenden möchten. Die PID lässt sich mit dem Befehl ps herausfinden.

Um alle laufenden Prozesse anzuzeigen, verwenden Sie die Option -e (alle Prozesse). Da die Ausgabe sehr umfangreich sein kann, ist es ratsam, sie mit less zu filtern. Geben Sie dazu ps -e | less ein und bestätigen Sie mit der Eingabetaste.

ps -e | less

Sie erhalten dann eine Liste der Prozesse. Mit der Taste „/“ können Sie in less vorwärts und mit „?“ rückwärts suchen.

Um den gewünschten Prozess gezielter zu finden, können Sie die Ausgabe von ps mit grep filtern und dabei den Namen oder einen Teil des Namens des Prozesses angeben.

ps -e | grep shutter

Sobald Sie die PID des zu beendenden Prozesses ermittelt haben, übergeben Sie diese als Parameter an den kill-Befehl. Um beispielsweise den Prozess „shutter“ zu beenden, dessen PID im vorherigen Beispiel 2099 ist, verwenden Sie folgenden Befehl:

kill 2099

Der kill-Befehl ist ein stiller Killer – er gibt keine Rückmeldung, wenn er erfolgreich war.

Der pkill-Befehl

Mit dem Befehl pkill können Sie Prozesse anhand ihres Namens beenden, ohne die PID kennen zu müssen. Geben Sie dazu einen Suchbegriff an, anhand dessen pkill die laufenden Prozesse identifiziert. Es ist wichtig, dass der Suchbegriff korrekt ist, da alle passenden Prozesse beendet werden.

Als zusätzliche Sicherheitsmaßnahme können Sie vor dem pkill-Befehl den Befehl pgrep verwenden. pgrep akzeptiert ebenfalls einen Suchbegriff und listet die PIDs aller übereinstimmenden Prozesse auf. Dies ist sicher, da pgrep keine Prozesse beendet. Dadurch können Sie überprüfen, ob Ihr Suchbegriff korrekt ist, bevor Sie ihn mit pkill verwenden. pkill und pgrep behandeln den Suchbegriff auf die gleiche Weise. Tatsächlich teilen sie sich dieselbe Manual-Seite.

Nehmen wir an, es gibt einen Prozess mit „subq“ im Namen. Wir nutzen den Befehl ps -u dave | grep subq, um uns den vollständigen Namen des Prozesses anzeigen zu lassen.

ps -u dave | grep subq

Angenommen, unser Benutzer hat diesen Befehl nicht ausgeführt und weiß nur, dass der Prozessname die Teilzeichenfolge „subq“ enthält. Er nutzt pgrep, um sicherzustellen, dass es nur eine Übereinstimmung gibt, und verwendet diesen Suchbegriff dann mit pkill.

pgrep subq
pkill subq

Mit pkill können Sie auch mehrere Prozesse gleichzeitig beenden. Hier verwendet der Benutzer pgrep, um alle Chrome-Prozesse anzuzeigen, die er anschließend mit pkill beendet. Mit einem erneuten pgrep wird dann überprüft, ob alle Prozesse entfernt wurden.

pgrep chrome
pkill chrome
pgrep chrome

Sollten mehrere Prozesse mit demselben Namen laufen, Sie aber nicht alle beenden wollen, können Sie pgrep mit der Option -f (Befehlszeile) nutzen, um die einzelnen Prozesse zu unterscheiden. Ein Beispiel hierfür wären zwei Ping-Prozesse, von denen Sie nur einen beenden möchten. Die jeweiligen Befehlszeilen können genutzt werden, um die Prozesse zu unterscheiden. Beachten Sie hierbei die Verwendung von Anführungszeichen um den Befehlszeilenparameter.

pgrep -f "ping 192.168.4.22"
pkill -f "ping 192.168.4.22"

Der killall-Befehl

Achtung: Auf Solaris- und OpenIndiana-Systemen beendet der Befehl killall alle Prozesse, die Ihnen gehören. Wenn Sie als „root“ oder mit „sudo“ killall ausführen, starten Sie Ihren Computer neu! Bei der Recherche für diesen Artikel wurde dieses Verhalten in der aktuellen Version von OpenIndiana Hipster 2018.10 bestätigt.

Der killall-Befehl funktioniert ähnlich wie pkill, allerdings gibt es einen wesentlichen Unterschied. Anstatt einen Suchbegriff zu verwenden, müssen Sie den genauen Prozessnamen angeben.

Sie können keine Teilübereinstimmung des Prozessnamens angeben, sondern müssen den vollständigen Namen verwenden:

killall shutt
killall shutter

Mit der Option -y (jünger als) können Sie Prozesse beenden, die weniger als eine bestimmte Zeit laufen. Der Zeitraum wird in Zahlen gefolgt von einer dieser Einheiten angegeben:

s (Sekunden)
m (Minuten)
h (Stunden)
d (Tage)
w (Wochen)
M (Monate, Großbuchstabe „M“)
j (Jahre)

Um einen Prozess namens „ana“ zu beenden, der gerade gestartet wurde, und alle älteren Instanzen von „ana“ weiterhin laufen zu lassen, könnten Sie den folgenden Befehl verwenden, wenn Sie innerhalb von zwei Minuten reagieren:

killall -y 2m ana

Mit der Option -o (älter als) können Sie Prozesse beenden, die länger als eine angegebene Zeit laufen. Dieser Befehl beendet beispielsweise alle SSH-Verbindungen, die länger als einen Tag laufen:

killall -o 1d sshd

Vorsicht ist geboten

Diese Befehle ermöglichen es Ihnen, fehlerhafte Prozesse gezielt und sicher zu identifizieren und zu beenden.

Seien Sie dennoch immer vorsichtig. Überprüfen Sie zunächst, ob der Prozess, den Sie beenden möchten, wirklich der Richtige ist. Überprüfen Sie es dann noch einmal, um sicherzustellen, dass der ausgewählte Prozess auch wirklich derjenige ist, den Sie beenden wollen. Fahren Sie mit dem Beenden des Prozesses fort, wenn Sie zufrieden sind.