killall tötet nicht alle und tötet selten, wofür ist der Befehl dann?

killall tötet nicht alle und tötet selten, wofür ist der Befehl dann?

Ich verwende den killallBefehl 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 killallBefehl 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 -9Befehl manuell verwendet, um jeden einzelnen Prozess über seine PIDs zu beenden. Das hat funktioniert.

Ich verwende den Befehl meistens, kill -9weil er funktioniert. Der killallBefehl 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, pkillaber ich wäre dankbar, wenn ich erfahren würde, warum der killallBefehl nicht wie erwartet funktioniert. Ich habe sogar versucht, nur einen Prozess zu beenden, und es war ein Glücksspiel. Aber der kill -9Befehl funktioniert jedes Mal.

Irgendwelche Ideen?

PS: sudomacht 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

killallakzeptiert die meisten Syntaxelemente wie kill. Insbesondere muss man nichts Ausgefallenes schreiben, um killalldas Ä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 -9oder gleichwertig zu verwenden, killall -KILLes sei denn, andere Maßnahmen wurden bereits erfolglos ausprobiert.)

Antwort3

Für alle, die eine schnelle Antwort suchen:

sudo killall -s SIGTERM processname

verwandte Informationen