- Kill (Unix)
-
kill (engl. töten) ist ein Unix-Kommando und gleichnamiger Systemaufruf, um unter dem Betriebssystem laufenden Prozessen Signale zu schicken. Standardmäßig wird dabei das Signal SIGTERM versendet, welches den entsprechenden Prozess dazu auffordert, sich zu beenden. Da das Beenden von Prozessen nur ein Anwendungsfall des Programms
kill
bzw. Systemaufrufeskill()
ist, ist die Bezeichnung kill irreführend, da es sich lediglich um Interprozesskommunikation handelt.Inhaltsverzeichnis
Funktionsweise
Der Unix-Befehl kill stellt nur einen Wrapper um den Betriebssystemaufruf
kill()
dar. Zwar ist es auf jedem Unix-Derivat als alleinstehende Anwendung vorhanden (üblicherweise unter/bin/kill
), alle modernen Unix-Shells verfügen allerdings – aufgrund seiner trivialen Implementierung – über ein eingebauteskill
-Kommando.Mit kill können viele verschiedene Signale versendet werden[1], die am meisten benutzten Signale sind allerdings SIGTERM und SIGKILL. Ohne Angabe von Parametern versendet kill SIGTERM. Die empfangenden Programme können dieses Signal abfangen und vor dem Beenden noch unbedingt notwendige Arbeitsschritte durchführen, z. B. geöffnete Dateien abspeichern. SIGKILL wird verwendet, um einen Prozess, der sich trotz Empfang eines SIGTERM-Signals nicht beendet (z.B. weil er den Zustand eines Zombies erreicht hat), zu beenden. Neben dem Signal SIGSTOP ist SIGKILL daher das einzige Signal, welches vom Programm nicht „abgefangen“ werden kann, um programmspezifische Aktionen durchzuführen. Die zwei Signale SIGKILL und SIGSTOP werden demnach nur von dem Kernel „gesehen“ und bieten damit in jedem Fall zuverlässige Wege, einen Prozess zu kontrollieren. Während SIGKILL den Kernel anweist, den Prozess zu „töten“, pausiert der Kernel ihn mit SIGSTOP, bis das Signal SIGCONT empfangen wird.
Bei Unix als klassischem Mehrbenutzersystem hat jeder Prozess einen Inhaber (UID). Jeder Prozess darf nur ein Signal zu einem Prozess, der dem gleichen Inhaber gehört, versenden. Das heißt, dass jeder Benutzer auch nur seine eigenen Prozesse beenden darf. Ausgenommen ist der Superuser, welcher jedem Prozess auf dem System Signale schicken darf.
Verwendung
Der Syntax des Unix-Befehls lautet
kill Parameter eine oder mehrere Prozess-IDs
als optionaler Parameter kann das gewünschte Signal angegeben werden, in der Form
-SIGNAL
, wobei SIGNAL entweder der Signalnummer oder dem Namen entspricht.Um beispielsweise einem fiktiven Prozess mit der ID 4711 das Signal SIGTERM zu schicken, gibt es drei mögliche Aufrufvarianten:
kill 4711
kill -TERM 4711
kill -15 4711
Analog geschieht der Aufruf mit anderen Signalen, z.B. SIGKILL:
kill -KILL 4711
kill -9 4711
Alternativen
Tastenkombinationen
Moderne Unix-Shells fangen Tastenkombinationen ab, um sie laufenden Vordergrundprozessen zu schicken. Um ein Programm zu beenden, reicht unter Unix so meist die Eingabe von Strg und C, welches dem Prozess ein SIGINT-Signal schickt. Üblicherweise wird durch die Eingabe von Strg+Z SIGTSTP versandt, ferner mit Strg+\ SIGQUIT, welches ein Programm dazu auffordert, einen Speicherauszug (core dump) auszugeben.
killall
Einige Unix-Derivate, unter anderem Solaris, rufen das Unix-Kommando
killall
automatisch auf, wenn das System runterfährt. Es verhält sich wie kill, nur wird ein Signal nicht nur zu einem einzigen Prozess geschickt, sondern zu allen Prozessen auf dem System.Auf anderen Unix-Derivaten, u.a. IRIX, Linux und FreeBSD, wird das Kommando killall hingegen verwendet, um einen Prozess anhand seines Namens zu beenden. Um zum Beispiel XMMS, einen Mediaplayer, der per
xmms
aufgerufen wurde, zu beenden, gibt der Benutzerkillall xmms
ein. Auf diese Weise werden alle Prozesse mit dem Namenxmms
beendet.pkill
pkill
beendet Prozesse anhand von Teilen ihres Namens. Das Kommando wurde in Solaris 7 eingeführt und wurde seitdem auch in Linux und OpenBSD implementiert. pkill ermöglicht es, Prozesse anhand ihres Namens einfacher zu beenden, als es mit killall möglich ist, wenn man deren genauen Namen nicht kennt.Um zum Beispiel die dem Webbrowser Firefox zugehörigen Prozesse zu beenden, ohne sich dabei pkill sowie pgrep zu bedienen, müsste man eine Zeile wie
kill `ps -ax | grep firefox| grep -v grep | awk '{print $1}'`
schreiben, wohingegen mit pkill bereits die Eingabe vonpkill firefox
den Zweck erfüllt.Einzelnachweise
- ↑ siehe Signal (Computer) für eine Liste der üblichen Signale
Siehe auch
- xkill, zum Beenden von X-Window-Programmen
Weblinks
- Zum Unix-Befehl:
kill(1)
: terminate a process – Linux-Manpage (Englisch) - Zum Systemaufruf:
kill(2)
: send signal to a process – Linux-Manpage (Englisch) killall(1)
: kill processes by name – Linux-Manpage (Englisch)pkill(1)
: look up or signal processes based on name and other attributes – Linux-Manpage (Englisch)xkill(1)
: kill a client by its X resource – Linux-Manpage (Englisch)
Wikimedia Foundation.