Manchmal, wenn ich mich schnell abmelden möchte, tue ich das kill -15 -1
. Ich habe bemerkt, dass Bash SIGTERM ignoriert.
Ich frage mich, was der Grund für ein solches Bash-Verhalten ist .
Es ist nicht sehr UNIX'y, SIGTERM ohne guten Grund zu ignorieren, nicht wahr?
AKTUALISIEREN:
gleicher (kein) Effekt für alle:
$ kill -TERM $$
$ type kill
kill is a shell builtin
$ command kill -TERM $$
$ /bin/kill -TERM $$
UPDATE2:
Von Mann schlagen :
Wenn bash interaktiv ist und keine Fallen vorhanden sind, wird SIGTERM ignoriert
Also wird es absichtlich gemacht. Aber warum?
/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.Antworten:
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:
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 danachset +m
) haben keine Prozessgruppen für Hintergrundbefehle erstellt. Sie können den Befehl also verwendenkill 0
, um alle Hintergrundbefehle zu beenden, ohne sich abzumelden.² Daherkill 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ührenpkill -t $TTY
oderpkill -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
oderlogout
) 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 verwendenkill -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 dannkill -123 -456 …
die Prozessgruppen.quelle
Dies könnte Ihre Frage beantworten:
QUELLE : Das GNU Bash Handbuch
quelle