Ich verwende den killall
Befehl gelegentlich, um Prozesse zu beenden. Der Grund, warum ich gelegentlich sage, ist, dass es bei mir in einigen Fällen nicht funktioniert hat.
Ein aktuelles Beispiel war Thunderbird, wo sich etwa 5 Instanzen im Speicher befanden, also entschied ich mich, den killall
Befehl zu verwenden. Er beendete 2 Prozesse und 3 waren noch im Speicher. Ich versuchte es erneut und die 3 waren immer noch da.
Also habe ich den kill -9
Befehl manuell verwendet, um jeden einzelnen Prozess über seine PIDs zu beenden. Das hat funktioniert.
Ich verwende den Befehl meistens, kill -9
weil er funktioniert. Der killall
Befehl hat mich so oft im Stich gelassen, dass ich ihn einfach nicht mehr verwende. Aber es muss einen Grund geben, warum er nicht funktioniert. Verwende ich ihn falsch?
Ich weiß, dass es andere Befehle wie diesen gibt, pkill
aber ich wäre dankbar, wenn ich erfahren würde, warum der killall
Befehl nicht wie erwartet funktioniert. Ich habe sogar versucht, nur einen Prozess zu beenden, und es war ein Glücksspiel. Aber der kill -9
Befehl funktioniert jedes Mal.
Irgendwelche Ideen?
PS: sudo
macht keinen Unterschied
Antwort1
Aus der Manpage für killall
killall sendet ein Signal an alle Prozesse, die einen der angegebenen Befehle ausführen. Wenn kein Signalname angegeben ist, wird SIGTERM gesendet.
Wenn Sie ein ausführen kill -9
, senden Sie das SIGKILL-Signal. Wenn Sie ein SIGKILL mit killall senden möchten, müssen Sie Folgendes tun:
killall -s SIGKILL <PROCESSNAME>
Eine gute Erklärung des Unterschieds zwischen SIGKILL und SIGTERM (und warum Sie zuerst SIGTERM ausprobieren sollten)
Aushttp://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/
Das Senden von Signalen an Prozesse mit kill auf einem Unix-System ist für die meisten Systemadministratoren kein neues Thema, aber ich wurde oft nach dem Unterschied zwischen kill und kill -9 gefragt.
Immer wenn Sie kill auf einen Prozess anwenden, senden Sie dem Prozess tatsächlich ein Signal (in fast allen Situationen – darauf werde ich gleich eingehen). Standard-C-Anwendungen haben eine Header-Datei, die die Schritte enthält, die der Prozess ausführen soll, wenn er ein bestimmtes Signal empfängt. Sie können eine vollständige Liste der auf Ihrem System verfügbaren Signale abrufen, indem Sie die Manpage für kill aufrufen.
Stellen Sie sich einen Befehl wie diesen vor:
kill 2563
Dadurch wird ein Signal namens SIGTERM an den Prozess gesendet. Sobald der Prozess die Benachrichtigung erhält, können verschiedene Dinge passieren:
- Der Vorgang kann sofort gestoppt werden
- Der Prozess kann nach einer kurzen Verzögerung nach dem Bereinigen der Ressourcen angehalten werden.
- Der Prozess kann auf unbestimmte Zeit weiterlaufen
Die Anwendung kann bestimmen, was sie tun möchte, sobald ein SIGTERM empfangen wird. Während die meisten Anwendungen ihre Ressourcen bereinigen und anhalten, tun dies manche möglicherweise nicht. Eine Anwendung kann so konfiguriert sein, dass sie beim Empfang eines SIGTERM etwas völlig anderes tut. Wenn sich die Anwendung in einem schlechten Zustand befindet, z. B. auf Festplatten-E/A wartet, kann sie möglicherweise nicht auf das gesendete Signal reagieren.
Die meisten Systemadministratoren greifen normalerweise auf das abruptere Signal zurück, wenn eine Anwendung nicht auf ein SIGTERM reagiert:
kill -9 2563
Die -9 teilt dem Kill-Befehl mit, dass Sie Signal Nr. 9 senden möchten, das SIGKILL heißt. Bei einem solchen Namen ist es offensichtlich, dass dieses Signal etwas mehr Gewicht hat.
Obwohl SIGKILL in derselben Signalheaderdatei wie SIGTERM definiert ist, kann es vom Prozess nicht ignoriert werden. Tatsächlich wird der Prozess nicht einmal auf das SIGKILL-Signal aufmerksam gemacht, da das Signal direkt an die Kernel-Initialisierung geht. An diesem Punkt wird die Init den Prozess stoppen. Der Prozess hat nie die Gelegenheit, das Signal abzufangen und darauf zu reagieren.
In manchen Situationen kann der Kernel den Prozess jedoch möglicherweise nicht erfolgreich beenden. Wenn der Prozess auf Netzwerk- oder Festplatten-E/A wartet, kann der Kernel ihn nicht stoppen. Zombie-Prozesse und Prozesse, die sich in einem ununterbrochenen Ruhezustand befinden, können vom Kernel ebenfalls nicht gestoppt werden. Um diese Prozesse aus dem System zu löschen, ist ein Neustart erforderlich.
Als Sie killall (SIGTERM) an die Thunderbird-Prozesse gesendet haben, haben Sie das Beenden dieser Prozesse angefordert. Einige dieser Prozesse funktionierten nicht richtig (wahrscheinlich der Grund, warum Sie sie überhaupt beenden mussten), sodass sie nicht auf das SIGTERM-Signal reagieren konnten.
Antwort2
killall
akzeptiert die meisten Syntaxelemente wie kill
. Insbesondere muss man nichts Ausgefallenes schreiben, um killall
das Äquivalent von auszuführen kill -9
. Das hier funktioniert prima:
killall -9 thunderbird
(Natürlich sollten Sie, wie besprochen, im Allgemeinen davor zurückschrecken, killall -9
oder gleichwertig zu verwenden, killall -KILL
es sei denn, andere Maßnahmen wurden bereits erfolglos ausprobiert.)
Antwort3
Für alle, die eine schnelle Antwort suchen:
sudo killall -s SIGTERM processname