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.