Wann sollte ich einen Prozess nicht beenden?

401

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:

  1. Wann und warum sollte kill -9verwendet werden? Wann und warum nicht
  2. Was sollte man vorher probieren?
  3. Welche Art des Debuggens eines "hängen gebliebenen" Prozesses könnte weitere Probleme verursachen?
Mikel
quelle
7
Eine gute verwandte SO Antwort .
JW013

Antworten:

362

Im Allgemeinen sollten Sie kill(kurz für kill -s TERModer auf den meisten Systemen kill -15) before kill -9( kill -s KILL) verwenden, um dem Zielprozess die Möglichkeit zu geben, nach sich selbst aufzuräumen. (Prozesse können nicht abfangen oder ignorieren SIGKILL, aber sie können und tun es häufig SIGTERM.) 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, ltraceund gdbsind im Allgemeinen eine gute Idee, um herauszufinden, warum ein festgefahrener Prozess nicht funktioniert. (Unter truss -uSolaris ist dies besonders hilfreich. Ich finde ltrace, dass Bibliotheksaufrufe zu oft in einem unbrauchbaren Format argumentiert werden.) Solaris verfügt auch über nützliche /procTools, von denen einige auf Linux portiert wurden. ( pstackist oft hilfreich).

Geekosaurier
quelle
67
Der zwingende Grund ist, dass Sie es wirklich bereuen werden, wenn Sie es sich zur Gewohnheit machen, SIGKILL zu senden, wenn Sie zu einem Programm gelangen, das beispielsweise eine wichtige Datenbank für Sie oder Ihr Unternehmen beschädigt. kill -9hat 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.
Arcege
9
@Mikel Außerdem ist es manchmal am besten, eine App dazu zu bringen, sich mit einem Signal wie SIGQUIT oder SIGSEGV zu bereinigen, wenn sie nicht auf SIGINT / SIGTERM reagiert. Zum Beispiel eine Vollbild-3D-App oder sogar Xorg. Mit SIGQUIT hat es keine Chance, irgendetwas zu bereinigen, aber es zu täuschen, dass ein Segmentfehler auftritt, und es wird das Gefühl haben, dass es keine andere Wahl hat, als zu bereinigen und zu beenden.
Pinguin359
12
@Arcege Denken Sie, dass es sich lohnt, eine Datenbank zu verwenden, die Daten beschädigt, wenn sie mit -9 gelöscht wird? iirc, mysql, bdb, pg, etc ... verhalten sich alle gut, wenn sie mit -9 getötet werden.
Dhruvbird
13
killall -9 java ftw
dmourati
23
@dhruvbird: Nur weil deine DBs mit kugelsicheren Westen ausgestattet sein sollen, heißt das nicht, dass du sie abschießen sollst, wenn du es nicht brauchst. Sie mögen Recht haben, dass es nicht so riskant ist, wie Arcege zu sagen scheint, aber ich denke, sein Standpunkt ist immer noch, dass es riskant ist und ein letzter Ausweg sein sollte.
Bilderstürmer
228

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).

(Zitat Greuel)

Nein nein Nein. Verwende nicht kill -9.

Es gibt dem Prozess keine Chance, sauber zu werden:

1) Steckdosenverbindungen abschalten

2) Bereinigen Sie temporäre Dateien

3) informieren seine Kinder, dass es weggeht

4) Setzen Sie die Klemmeneigenschaften zurück

und so weiter und so fort und so fort.

Senden Sie im Allgemeinen 15 und warten Sie ein oder zwei Sekunden. Wenn dies nicht funktioniert, senden Sie 2 und wenn dies nicht funktioniert, senden Sie 1. Wenn dies nicht funktioniert, ENTFERNEN SIE DEN BINARY, da sich das Programm schlecht verhält!

Verwende nicht kill -9. Nehmen Sie den Mähdrescher nicht heraus, nur um den Blumentopf aufzuräumen.

Nur eine weitere nutzlose Nutzung des Usenets,

(.Unterschrift)

Shawn J. Goff
quelle
12
Schließt das Betriebssystem keine offenen Dateideskriptoren (einschließlich Sockets), wenn der Prozess beendet wird?
Brian Gordon
3
Ja, es wird. Angenommen, Sie beenden einen Serverprozess, während Clients verbunden sind, und die Clients bemerken nicht, dass der Server vor Ablauf der Zeitüberschreitung nicht erreichbar ist.
Björn Lindqvist
45
Ah ja das alte Argument "Wenn es in irgendeiner Weise unvollkommen ist, bist du dumm, es zu benutzen".
Timmmm
3
Oder dumm zu verwenden, wenn der fragliche Prozess die Produktion Ihres Unternehmens ist
Warren P
3
Wenn ein Prozess beendet wird, sendet der Socket RST an den Peer. Dabei sendet der Socket FIN, als ob der Prozess close aufruft oder den Socket herunterfährt. Es ist keine Zeitüberschreitung erforderlich. Eine Zeitüberschreitung tritt nur auf, wenn die Stromversorgung unterbrochen oder das Netzwerkkabel entfernt wird.
Strg-Alt-Delor
78

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.

dbrower
quelle
2
Wie testest du auf "random kill -9"? Wenn du kill -9 bekommst, bist du fertig und fertig.
Karel Bílek
18
@Karel: Sie testen, ob Ihr System danach wiederhergestellt werden kann, und bereinigen alle beschädigten Transaktionen, die zum Zeitpunkt von SIGKILL verarbeitet wurden.
Tadeusz A. Kadłubowski
7
Es ist nicht in Ordnung, kill -9so 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 oder kill -9das 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.
Juli
7
Ich vermute, Michael meinte mit "OK", dass Ihr Programm mit dieser Situation angemessen umgehen und in der Lage sein sollte, beim Neustart eine Art Bereinigung durchzuführen. Zum Beispiel PID-Dateien bereinigen und so weiter, anstatt nur das Spielzeug aus dem Kinderwagen zu werfen und sich zu weigern, anzufangen.
Gerryk
2
@gerryk Sie sollten in der Tat, aber das Problem ist, dass einige Leute diese Antwort als "Lizenz zum Töten von -9" betrachten, unabhängig von der Situation und der Umgebung. Es ist eine verantwortungslose Haltung.
Juli
39

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.

borud
quelle
4
Ich stimme zu, dass ein Prozess so geschrieben werden sollte, dass er für einen solchen Fehler tolerant ist, aber ich denke, es ist immer noch eine schlechte Praxis, dies zu tun. Eine Datenbank wird wiederhergestellt, erkennt jedoch möglicherweise den unhöflichen Abbruch und löst beim Neustart eine erhebliche Überprüfung der Wiederherstellung aus. Und was ist mit den Anfragen, die ein Prozess bearbeitet? Sie werden alle sofort getrennt, die Clients könnten Fehler haben und auch scheitern?
Daniel James Bryars
3
Eine Datenbank, die zu keinem Zeitpunkt gelöscht werden kann, ist keine zuverlässige Datenbank. Dies ist eine ziemlich grundlegende Voraussetzung, wenn Sie Konsistenz benötigen. Was die Clients betrifft: Wenn sie beim Trennen der Verbindung verdrahtet sind und Daten beschädigen, sind sie ebenfalls schlecht konzipiert. Die Möglichkeit, den Dienstausfall zu beheben, besteht in Redundanz- und automatischen Failover- / Retry-Strategien. Normalerweise ist ein schneller Ausfall des Systems dem Versuch einer Wiederherstellung vorzuziehen.
Borud
4
@borud Es ist vielleicht keine perfekt geschriebene Software, aber es ist Software, die die Leute ständig benutzen. Welche Systemadministratoren haben den Luxus, immer eine perfekt geschriebene Software auswählen zu können, um sich nach plötzlichen Störungen immer wieder ordnungsgemäß zu erholen? Nicht viele. Persönlich verwende ich Shutdown-Skripte und starte / beende Prozesse über diese. Wenn sie nicht auf das Shutdown-Skript reagieren (was eine ordnungsgemäße Signalisierung des Prozesses bewirkt), bringe ich -9 um.
Steve Sether
2
Es gibt keinen Unterschied zwischen dem Kochen von einfachen Sachen und komplexeren Gerichten in Bezug auf die Werkzeuge. Der Unterschied ist der Koch. (Wenn Sie jedoch so viel Zeit mit Kochen verbringen wie ich, stellen Sie fest, dass Robustheit bei Küchenwerkzeugen eine Mindestanforderung ist und dass die meisten Leute, die Küchenbedarf an Verbraucher verkaufen, ein schlechtes Werkzeug nicht von einem guten Werkzeug unterscheiden können.)
borud
1
Also ermutigen Sie die Leute, schlampig zu sein, weil es schwierig ist, die Dinge richtig zu machen? Immer mehr Software wird in vorübergehenden Betriebsumgebungen ausgeführt. Wenn Sie Software schreiben, die pingelig wird, wenn sie nicht ordnungsgemäß heruntergefahren wird, fällt es Ihnen schwer, Arbeitgeber davon zu überzeugen, Sie als Entwickler einzustellen.
Borud
10

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 -9einen <defunct>Prozess auszuführen, um ps -efzu sehen, was sein Elternteil ist, und versuchen Sie das -15(TERM) oder -2(INT) und zuletzt -9(KILL) auf seinem Elternteil.

Hinweis: Was ps -efmacht .

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 -9fü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)

Eduard Florinescu
quelle
6

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:

ps -ef|remove all processes not matching a certain criteria| awk '{print $2}'|ruby -e '$A=stdin.readlines; A.reverse.each{|a| puts "kill -9 #{a}"}'|bash

Denken Sie daran, dass killein 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.

HandyGandy
quelle
1
Die Gegenstimme war jemand anderes. Aber welche Ressourcen werden nicht freigegeben? Meinen Sie damit nur, dass der Prozess seine normale Bereinigung nicht durchführen kann? Was ist mit Dateisperren, Semaphoren usw.? Können Sie näher darauf eingehen?
Mikel
Sieht so aus, als müssten SysV Shared Memory und Semaphore zumindest bereinigt werden. archives.postgresql.org/pgsql-general/2006-10/msg01065.php
Mikel
8
Diese Antwort ist teilweise verwirrend und teilweise falsch. kill -9 1wird bei den meisten Unices einfach ignoriert. Es gibt keine Notwendigkeit zu vermeiden , kill -9für mount, aber kein Sinn darin auch nicht . Ich weiß nicht, was Sie mit "Reihenfolge der Prozesse umkehren" meinen. kill -9stoppt (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 mit kill -9setzt die meisten Ressourcen frei, aber nicht alle .
Gilles
5

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 SIGKILLan eine PID keine Garantie für deren Tötung. Wenn es in einem syscall oder bereits zombied festsitzt ( Zin ps) kann es weiterhin zombied werden. Dies ist häufig der Fall, wenn ein Prozess lange läuft und vergessen wird, bgbevor versucht wird, kill -9ihn auszuführen . Ein einfacher fgBefehl 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 sie SIGKILLvom 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, sondernkill die negierte PID zu verwenden . Es gibt keine Garantie SIGHUP, dass SIGPIPEoder SIGINTandere Signale danach bereinigt werden, und es ist ärgerlich, eine Reihe von nicht genehmigten Prozessen zu bereinigen (nicht vergessen, Mischling?).

Böser Bonus: kill -9 -1ist etwas schädlicher als kill -9 1(Nicht als Root ausführen, es sei denn, Sie möchten sehen, was auf einer wegwerfbaren, unwichtigen VM passiert.)

dhchdhd
quelle
3

Warum möchten Sie kill -9einen Vorgang nicht normal durchführen?

Nach man 7 signal:

Die Signale SIGKILL und SIGSTOP können nicht erfasst, blockiert oder ignoriert werden.

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 -9einen Prozess ausführen

Sie sollten Folgendes sicherstellen, bevor Sie das Signal an den Prozess senden:

  1. Stellen Sie sicher, dass der Prozess nicht beschäftigt ist (dh "Arbeit" erledigt); Das Senden eines kill -9an den Prozess führt im Wesentlichen zum Verlust dieser Daten.
  2. Wenn der Prozess eine nicht reagierende Datenbank ist, stellen Sie sicher, dass zuerst die Caches geleert wurden. Einige Datenbanken unterstützen das Senden anderer Signale an den Prozess, um das Leeren des Caches zu erzwingen.

quelle
3

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 SIGTERMund SIGKILLoder sogar SIGTERM, SIGINTund SIGKILL. 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

Dr. Beco
quelle