Ich bin immer sehr zögerlich zu rennen kill -9
, aber ich sehe, dass andere Administratoren es fast routinemäßig tun.
Ich denke, es gibt wahrscheinlich einen vernünftigen Mittelweg, also:
- Wann und warum sollte
kill -9
verwendet werden? Wann und warum nicht - Was sollte man vorher probieren?
- Welche Art des Debuggens eines "hängen gebliebenen" Prozesses könnte weitere Probleme verursachen?
Antworten:
Im Allgemeinen sollten Sie
kill
(kurz fürkill -s TERM
oder auf den meisten Systemenkill -15
) beforekill -9
(kill -s KILL
) verwenden, um dem Zielprozess die Möglichkeit zu geben, nach sich selbst aufzuräumen. (Prozesse können nicht abfangen oder ignorierenSIGKILL
, aber sie können und tun es häufigSIGTERM
.) Wenn Sie dem Prozess nicht die Möglichkeit geben, seine Arbeit abzuschließen und zu bereinigen, verbleiben möglicherweise beschädigte Dateien (oder andere Zustände) um ihn herum wird nach einem Neustart nicht verstehen können.strace
/truss
,ltrace
undgdb
sind im Allgemeinen eine gute Idee, um herauszufinden, warum ein festgefahrener Prozess nicht funktioniert. (Untertruss -u
Solaris ist dies besonders hilfreich. Ich findeltrace
, dass Bibliotheksaufrufe zu oft in einem unbrauchbaren Format argumentiert werden.) Solaris verfügt auch über nützliche/proc
Tools, von denen einige auf Linux portiert wurden. (pstack
ist oft hilfreich).quelle
kill -9
hat seine Verwendung als Terminator des letzten Auswegs, Betonung des letzten Auswegs; Administratoren, die es vor dem letzten Ausweg verwenden, a) verstehen es nicht, ein zu guter Administrator zu sein, und b) sollten sich nicht auf einem Produktionssystem befinden.Randal Schwartz pflegte häufig "Nutzlose Verwendung von (x)" in Listen zu posten. Ein solcher Beitrag war etwa
kill -9
. Es enthält Gründe und ein Rezept zu folgen. Hier ist eine rekonstruierte Version (unten zitiert).quelle
Es sollte immer in Ordnung sein
kill -9
, so wie es immer in Ordnung sein sollte, durch Ziehen am Stromkabel herunterzufahren. Es mag unsozial sein und etwas Erholung überlassen, aber es sollte funktionieren und ist ein Elektrowerkzeug für Ungeduldige.Ich sage dies als jemand, der zuerst "plain kill" (15) versucht, weil es einem Programm die Möglichkeit gibt, etwas aufzuräumen - vielleicht einfach in ein Protokoll "Exit on Sig 15" zu schreiben. Aber ich akzeptiere keine Beschwerde über Fehlverhalten bei einem Kill -9.
Der Grund: Viele Kunden tun es mit Dingen, die Programmierer lieber tun als nicht. Random Kill -9-Tests sind ein gutes und faires Testszenario. Wenn Ihr System nicht damit zurechtkommt, ist Ihr System kaputt.
quelle
kill -9
so wie es nicht in Ordnung ist, den Stecker abzuziehen. Natürlich gibt es Situationen, in denen Sie keine andere Wahl haben. Dies sollte jedoch ein letzter Ausweg sein. Natürlich sollte das Ziehen des Netzkabels oderkill -9
das Verhindern eines Neustarts der Anwendung oder des Betriebssystems keine nachteiligen Auswirkungen haben, aber Scheiße und die Verwendung der empfohlenen Methoden (kill [-15]
) oder das regelmäßige Herunterfahren helfen, die Unordnung zu vermeiden, die auftreten könnte, wenn Sie unterbrechen Programme und Betriebssysteme routinemäßig auf diese Weise. In jedem Fall besteht unabhängig von der Robustheit des Codes immer das Risiko, Daten zu verlieren.Ich benutze kill -9 auf die gleiche Weise, wie ich Küchenutensilien in die Spülmaschine wirfe: Wenn ein Küchenutensilien durch die Spülmaschine zerstört wird, dann will ich es nicht.
Das Gleiche gilt für die meisten Programme (sogar für Datenbanken): Wenn ich sie nicht töten kann, ohne dass irgendwelche Probleme auftreten, möchte ich sie nicht wirklich verwenden. (Und wenn Sie zufällig eine dieser Nicht-Datenbanken verwenden, die Sie dazu ermutigt, so zu tun, als hätten sie Daten erhalten, wenn dies nicht der Fall ist: Nun, ich denke, es ist an der Zeit, dass Sie darüber nachdenken, was Sie tun.)
Denn in der realen Welt kann es aus irgendeinem Grund jederzeit zu Ausfällen kommen.
Leute sollten Software schreiben, die tolerant gegenüber Abstürzen ist. Insbesondere auf Servern. Sie sollten lernen, wie Sie Software entwickeln, die davon ausgeht, dass Dinge brechen, abstürzen usw.
Gleiches gilt für Desktop-Software. Wenn ich meinen Browser herunterfahren möchte, dauert es normalerweise AGES, um herunterzufahren. Es gibt nichts, was mein Browser tun muss , was länger als höchstens ein paar Sekunden dauern sollte. Wenn ich ihn auffordere, herunterzufahren, sollte er das sofort schaffen. Wenn dies nicht der Fall ist, ziehen wir kill -9 heraus und schaffen es.
quelle
Nicht erwähnt in allen anderen Antworten ist ein Fall, in dem
kill -9
überhaupt nicht funktioniert, wenn ein Prozess beendet ist<defunct>
und nicht beendet werden kann:Wie kann ich einen <defunct> -Prozess beenden, dessen übergeordnetes Element init ist?
Was ist für einen Prozess nicht mehr aktuell und warum wird er nicht getötet?
Also, bevor Sie versuchen,
kill -9
einen<defunct>
Prozess auszuführen, umps -ef
zu sehen, was sein Elternteil ist, und versuchen Sie das-15
(TERM) oder-2
(INT) und zuletzt-9
(KILL) auf seinem Elternteil.Hinweis: Was
ps -ef
macht .Späteres Bearbeiten und Vorsicht: Gehen Sie beim Beenden von Prozessen, deren Eltern oder Kindern mit Vorsicht vor, da sie möglicherweise geöffnete oder beschädigte Dateien, unfertige Verbindungen, beschädigte Datenbanken usw. hinterlassen, es sei denn, Sie wissen, was
kill -9
für einen Prozess erforderlich ist, und verwenden Sie ihn nur als letzten Ausweg , und wenn Sie kill ausführen müssen, verwenden Sie vor der Verwendung die oben angegebenen Signale-9 (KILL)
quelle
Mach niemals niemals einen
kill -9 1
. Vermeiden Sie es auch, bei bestimmten Prozessen wie mount` einen Kill auszuführen. Wenn ich viele Prozesse beenden muss (z. B. wenn eine X-Sitzung unterbrochen wird und ich alle Prozesse eines bestimmten Benutzers beenden muss), kehre ich die Reihenfolge der Prozesse um. Zum Beispiel:Denken Sie daran, dass
kill
ein Prozess nicht gestoppt und seine Ressourcen freigegeben werden. Es wird lediglich ein SIGKILL-Signal an den Prozess gesendet. Sie könnten mit einem Prozess enden, der aufgehängt ist.quelle
kill -9 1
wird bei den meisten Unices einfach ignoriert. Es gibt keine Notwendigkeit zu vermeiden ,kill -9
fürmount
, aber kein Sinn darin auch nicht . Ich weiß nicht, was Sie mit "Reihenfolge der Prozesse umkehren" meinen.kill -9
stoppt (wie in, kill) einen Prozess, ohne ihm eine Chance zu geben, sich zu beschweren, aber das Töten wird nicht sofort stattfinden, wenn sich der Prozess in einem nicht unterbrechbaren Systemaufruf befindet . Das Beenden eines Prozesses mitkill -9
setzt die meisten Ressourcen frei, aber nicht alle .Es ist kein reibungsloser Prozess, Prozesse wohl oder übel zu beenden: Daten können verloren gehen, schlecht gestaltete Apps können sich auf subtile Weise selbst zerstören, die nicht ohne eine Neuinstallation behoben werden können gegebene Situation. und was wäre gefährdet. Der Benutzer sollte eine Vorstellung davon haben, was ein Prozess tut oder tun soll und welche Einschränkungen es gibt (Festplatten-IOPS, RSS / Swap), und er sollte abschätzen können, wie viel Zeit ein Prozess mit langer Laufzeit in Anspruch nehmen sollte (z. B. eine Dateikopie). mp3 reencoding, email migration, backup,
Darüber hinaus ist das Senden
SIGKILL
an eine PID keine Garantie für deren Tötung. Wenn es in einem syscall oder bereits zombied festsitzt (Z
inps
) kann es weiterhin zombied werden. Dies ist häufig der Fall, wenn ein Prozess lange läuft und vergessen wird,bg
bevor versucht wird,kill -9
ihn auszuführen . Ein einfacherfg
Befehl verbindet stdin / stdout erneut und hebt wahrscheinlich die Blockierung des Prozesses auf. Anschließend wird der Prozess in der Regel beendet. Wenn es an einer anderen Stelle oder in einer anderen Form eines Kernel-Deadlocks hängen bleibt, kann der Prozess möglicherweise nur durch einen Neustart entfernt werden. (Zombie-Prozesse sind bereits tot, nachdem sieSIGKILL
vom Kernel verarbeitet wurden (es wird kein weiterer Userland-Code ausgeführt). In der Regel gibt es einen Kernel-Grund (ähnlich wie "blockiert" zu werden, wenn auf einen Systemaufruf gewartet wird), dass der Prozess nicht beendet wird.)Wenn Sie einen Prozess und alle seine untergeordneten Elemente beenden möchten, gewöhnen Sie sich an , nicht nur die PID selbst, sondern
kill
die negierte PID zu verwenden . Es gibt keine GarantieSIGHUP
, dassSIGPIPE
oderSIGINT
andere Signale danach bereinigt werden, und es ist ärgerlich, eine Reihe von nicht genehmigten Prozessen zu bereinigen (nicht vergessen, Mischling?).Böser Bonus:
kill -9 -1
ist etwas schädlicher alskill -9 1
(Nicht als Root ausführen, es sei denn, Sie möchten sehen, was auf einer wegwerfbaren, unwichtigen VM passiert.)quelle
Warum möchten Sie
kill -9
einen Vorgang nicht normal durchführen?Nach
man 7 signal
:Dies bedeutet, dass die Anwendung, die eines dieser Signale empfängt, diese nicht abfangen kann, um ein Abschaltverhalten auszuführen.
Was Sie tun sollten, bevor Sie
kill -9
einen Prozess ausführenSie sollten Folgendes sicherstellen, bevor Sie das Signal an den Prozess senden:
kill -9
an den Prozess führt im Wesentlichen zum Verlust dieser Daten.quelle
Ich habe ein Skript erstellt, mit dem dieses Problem automatisiert werden kann.
Es basiert auf meiner vollständigen Antwort 2 in einer Frage, die bei stackoverflow sehr ähnlich ist .
Dort können Sie alle Erläuterungen nachlesen. Zusammenfassend würde ich empfehlen , einfach
SIGTERM
undSIGKILL
oder sogarSIGTERM
,SIGINT
undSIGKILL
. Ich gebe jedoch mehr Optionen in der vollständigen Antwort.Bitte zögern Sie nicht, es aus dem Github- Repository herunterzuladen (zu klonen), um Killgracefully 1 zu erstellen
quelle