Erstens ist dies nicht spezifisch für Bash. ATT ksh, dash und zsh verhalten sich gleich: Sie ignorieren SIGTERM und SIGQUIT während der Befehlszeilenausgabe. mksh wird ebenfalls nicht beendet, sondern wie SIGINT behandelt.
Sowohl das ksh-Handbuch als auch das Bash-Handbuch rechtfertigen das Ignorieren von SIGTERM in folgenden Begriffen:
Das kill 0
tötet also keine interaktive Shell
kill 0
Bricht alle Prozesse in der Prozessgruppe ab , in der sich die Shell befindet¹. Kurz gesagt, die Prozessgruppe besteht aus allen Prozessen, die im Vordergrund auf einem Terminal ausgeführt werden, oder allen Prozessen in einem Hintergrund oder einem angehaltenen Job.
Genauer gesagt passiert dies in modernen Schalen mit Jobkontrolle . In solchen Shells kill 0
wäre dies nicht sinnvoll, da sich die Shell in einer eigenen Prozessgruppe befindet. Ältere Shells (oder moderne Shells danach set +m
) haben keine Prozessgruppen für Hintergrundbefehle erstellt. Sie können den Befehl also verwenden kill 0
, um alle Hintergrundbefehle zu beenden, ohne sich abzumelden.² Daher kill 0
sieht die Begründung wie eine alte aus, die heutzutage nicht mehr gerechtfertigt ist, sondern aus Gründen der Abwärtskompatibilität beibehalten wird.
Es gibt jedoch andere ähnliche Situationen, in denen es nützlich ist, die Schale immun zu machen. Stellen Sie sich den Fall vor, in dem Prozesse ein Terminal blockieren und Sie diese beenden möchten, ohne sich abzumelden. Viele Systeme verfügen über ein Tool, mit pkill
dem Sie die auf einem Terminal ausgeführten Prozesse beenden können. Sie können alle Prozesse ausführen pkill -t $TTY
oder pkill -QUIT -t $TTY
beenden, die auf dem aktuellen Terminal ausgeführt werden, mit Ausnahme der Shell, die das Signal ignoriert.
Eine Shell verschwindet normalerweise entweder, wenn der Benutzer sie verlässt (mit einem Befehl wie exit
oder logout
) oder wenn ihr Terminal das Ende der Eingabe signalisiert (der Benutzer kann dies durch Drücken von Ctrl+ verursachen D) oder ganz verschwindet. In diesem letzten Fall empfängt die Shell das Signal SIGHUP und ignoriert dieses nicht.
Wenn Sie sich von einer X-Sitzung abmelden, kill -15 -1
wird dies ausgeführt, da der Terminalemulator beendet wird, wodurch die Shell SIGHUP empfängt. Es ist in der Tat genug, um den X-Server zu töten, aber das erfordert das Finden seiner Prozess-ID. Wenn Sie möchten, dass derselbe Befehl in einer Textsitzung ausgeführt wird, können Sie ihn verwenden kill -15 -1; exit
. Das ist sowieso ein ziemlich gefährlicher Befehl.
¹ Dies scheint in der Regel nicht in Shell-Handbüchern erwähnt zu werden. Dies ist eine Funktion des zugrunde liegenden Systemaufrufs. Es wird ausdrücklich in der POSIX-Spezifikation erwähnt .
² Führen Sie jobs -l
dazu heutzutage eine Liste der Jobs mit ihrer Prozessgruppen-ID aus und beenden Sie dann kill -123 -456 …
die Prozessgruppen.
/bin/kill
oder die Shell eingebaut? Wenn letzteres der Fall ist, schätze ich, dass sich die Shell nicht mit ihrem eigenen eingebauten selbst umbringen wird.