kill (Unix)

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

kill (engl. töten) ist ein Unix-Kommando und gleichnamiger Systemaufruf, um unter dem Betriebssystem laufenden Prozessen Signale zu schicken. Standardmäßig wird bei dem UNIX-Kommando kill 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. Systemaufrufes kill() ist, ist die Bezeichnung kill irreführend, da es sich allgemeiner um Interprozesskommunikation handelt. Der Name stammt von Unix-Versionen vor Unix-V4, bei denen es noch keinen Signal-Parameter gab.

Funktionsweise[Bearbeiten]

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 eingebautes kill-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.

Nicht jeder Aufruf von kill dient dazu, einen Prozess zu beenden. So gibt z. B. das Programm dd bei dem Signal SIGUSR1 den aktuellen Verarbeitungsstatus eines Kopiervorgangs auf der Standardfehlerausgabe aus, dies lässt sich mit kill -USR1 $pid provozieren.

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[Bearbeiten]

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[Bearbeiten]

Tastenkombinationen[Bearbeiten]

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[Bearbeiten]

Einige Unix-Derivate, unter anderem Solaris, rufen das Unix-Kommando killall automatisch auf, wenn das System herunterfä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 Benutzer killall xmms ein. Auf diese Weise werden alle Prozesse mit dem Namen xmms beendet.

pkill[Bearbeiten]

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 [f]irefox| awk '{print $1}'` schreiben, wohingegen mit pkill bereits die Eingabe von pkill firefox den Zweck erfüllt.

Einzelnachweise[Bearbeiten]

  1. siehe Signal (Computer) für eine Liste der üblichen Signale

Siehe auch[Bearbeiten]

  • xkill, zum Beenden von X-Window-Programmen

Weblinks[Bearbeiten]