Wie beende ich alle gleichnamigen Prozesse auf sanftere Weise als bisher killall
? Ich möchte die Prozesse nicht unterbrechen, sondern ihnen Zeit lassen, um sie ordnungsgemäß zu beenden.
Siehe auch:
Wie kann ich Prozesse in Ubuntu beenden?
Was ist der Unterschied zwischen Kill Process und End Process im Systemmonitor?
command-line
process
kill
killall
verrückt nach natty
quelle
quelle
Antworten:
1. `killall` schon nett (SIGTERM)
killall
standardmäßig sendetSIGTERM
. Dies ist bereits der nette Ansatz, der Anwendungen die Möglichkeit lässt, nach sich selbst aufzuräumen. Das "geh schon sterben, gerade jetzt!" Ansatz ist es, einSIGKILL
Signal zu senden , bei dem dies als Option angegeben werden musskillall
. Aus der GNU C-Bibliothek: Beendigungssignale :2. Der "End process" des Systemmonitors ist genauso schön (auch SIGTERM)
Sie verlinken auf eine Frage zu GNOME System Monitor. Dies wird auch
SIGTERM
für die Aktion "Prozess beenden" verwendet (und mir ist klar, dass ich der Antwort auf diese Frage widerspreche). Sie finden es im Quellcode, um sich zu verifizieren:Daten / Menüs.ui :
Die 15 hier ist die Signalnummer. Signal 15 ist
SIGTERM
. Und der Systemmonitor wurde bereits verwendet,SIGTERM
bevor andere Fragen gestellt und beantwortet wurden.Technischer Nachtrag (als Antwort auf einen Kommentar)
In der Github-Darstellung von sehen Sie
git blame
die Änderungen, die an der Schreibweise der Signale im Quellcode von GNOME System Monitor vorgenommen wurden:383007f2 24. Juli 2013 Ersetzter duplizierter Code zum Senden von Signalen mit GAction-Parametern.
0e766b2d 18. Juli 2013 Popup-Menü für den Port-Prozess an GAction
97674c79 3. Oktober 2012 ProcData-Struktur
entfernen 38c5296c 3. Juli 2011 Einheitliche Einrückung für alle Quelldateien.
Nichts davon änderte sich von
SIGQUIT
zuSIGTERM
, und das letzte war von, bevor die verknüpfte Frage gestellt wurde.quelle
15
? Es könnte irgendwann geändert worden sein, sodass die alte Antwort in Bezug auf eine alte Version zu 100% richtig sein könnte .git grep 'SIGQUIT'
verrät nichts. Es wurde auch nichts in Bezug auf Signale gefundengit grep '>3<'
. Ich schließe daraus, dass der Gnome-System-Monitor wahrscheinlich noch nie benutzt wurdeSIGQUIT
.git grep
durchsucht nur den aktuellen Baum, nicht den gesamten Verlauf. Ich habegit blame
(eigentlich das Github-Äquivalent) benutzt, um ein bisschen tiefer zu graben, aber immer noch nichts.Die Antwort von @hvd ist grundsätzlich richtig. Um das noch mehr zu sichern, wird der
init
Prozess zuerstSIGTERM
an Prozesse gesendet,SIGKILL
wenn Sie Ihren Computer herunterfahren, und wird dann nach einer Verzögerung gesendet, wenn sie noch nicht beendet wurden. Prozesse können nicht verarbeitet / ignoriert werdenSIGKILL
.Um ein bisschen mehr Details zu geben, ist die eigentliche Antwort, dass Sie nicht sicher wissen können, ob das Programm damit fertig wird.
SIGTERM
ist das gebräuchlichste Signal, um ein Programm höflich zum Beenden aufzufordern, aber die gesamte Signalverarbeitung hängt davon ab, ob das Programm etwas mit dem Signal tut.Anders ausgedrückt, basierend auf den anderen Antworten, wenn Sie ein Programm von @Jos oder @AlexGreg geschrieben hätten, dann wären sie vermutlich handhabbar,
SIGQUIT
aber möglicherweise nichtSIGTERM
, und daherSIGTERM
wäre das Senden weniger "leise" alsSIGQUIT
.Ich habe einen Code geschrieben, mit dem Sie selbst herumspielen können. Speichern Sie das unten stehende als
signal-test.c
, dann kompilieren Sie mitSie können es dann ausführen
./signal-test
und sehen, was passiert, wenn Sie verschiedene Signale mit sendenkillall -s <signal>
.Der Code behandelt sowohl SIGTERM als auch SIGQUIT ordnungsgemäß. Sie können versuchen, die Zeilen zu kommentieren
signal(SIG...
(mit einem//
am Zeilenanfang), um den Signal-Handler zu entfernen, und dann die Signale erneut ausführen und senden. Sie sollten in der Lage sein, diese verschiedenen Ausgaben zu sehen:je nachdem, ob Sie mit den Signalen umgehen oder nicht.
Sie können auch versuchen, die Signale zu ignorieren:
Wenn Sie dies tun, führt das Senden zu
SIGTERM
nichts, und Sie müssenSIGKILL
den Vorgang mit beenden.Weitere Details in
man 7 signal
. Beachten Sie, dass die Verwendungsignal()
auf diese Weise als nicht portabel gilt - es ist jedoch viel einfacher als die Alternative!Eine weitere kleine Fußnote zu Solaris
killall
versucht, alle Prozesse abzubrechen. Alle von ihnen. Wenn Sie es als root ausführen, werden Sie überrascht sein :)quelle
pkill
. Der andere Grund ist, dass es mit gepaart ist,pgrep
was es einfacher macht, genau zu überprüfen, welche Prozesse beendet werden, und welches selbst eine besser übereinstimmende Semantik aufweist alsps | grep
."End all" wäre
killall -s SIGQUIT [process name]
. Wenn Sie eine ausgefallene Lösung wünschen, definieren Siealias endall='killall -s SIGQUIT'
.quelle
SIGQUIT
ist wie das Erstellen eines Prozessesabort(3)
: Der Prozess wird gelöscht und anschließend abgebrochen. Dies ist in keiner Weise netter / sanfter / freundlicher alsSIGTERM
die Standardeinstellung fürkillall
.SIGQUIT
(oder sogar besserSIGINT
), wird er möglicherweise „weicher“ behandelt alsSIGTERM
, dies liegt jedoch an der Anwendung. Unbearbeitet verursachen sie eine sofortige Kündigung.