it-swarm.com.de

Wann sollte ich einen Prozess nicht beenden?

Ich bin immer sehr zögernd, kill -9, aber ich sehe andere Administratoren, die das fast routinemäßig tun.

Ich denke, es gibt wahrscheinlich einen vernünftigen Mittelweg, also:

  1. Wann und warum sollte kill -9 verwendet werden? Wann und warum nicht?
  2. Was sollte man vorher probieren?
  3. Welche Art des Debuggens eines "blockierten" Prozesses könnte weitere Probleme verursachen?
405
Mikel

Im Allgemeinen sollten Sie kill verwenden (kurz für kill -s TERM oder auf den meisten Systemen kill -15) Vor kill -9 (kill -s KILL) um dem Zielprozess eine Chance zu geben, nach sich selbst aufzuräumen. (Prozesse können SIGKILL nicht abfangen oder ignorieren, aber sie können SIGTERM abfangen und tun dies häufig.) Wenn Sie dem Prozess keine Chance geben, das zu beenden, was er tut, und ihn zu bereinigen Möglicherweise bleiben beschädigte Dateien (oder andere Status) in der Nähe, die nach dem Neustart nicht mehr verstanden werden können.

strace/truss, ltrace und gdb sind im Allgemeinen gute Ideen, um herauszufinden, warum ein festsitzender Prozess feststeckt. (truss -u unter Solaris ist besonders hilfreich; Ich finde, dass ltrace zu oft Argumente für Bibliotheksaufrufe in einem unbrauchbaren Format präsentiert.) Solaris hat auch nützliche /proc-basierte Tools, von denen einige auf Linux portiert wurden. (pstack ist oft hilfreich).

366
geekosaur

Randal Schwartz pflegte häufig "Nutzlose Verwendung von (x)" auf Listen zu posten. Ein solcher Beitrag befasste sich mit kill -9. Es enthält Gründe und ein Rezept, das befolgt werden muss. Hier ist eine rekonstruierte Version (unten zitiert).

(Zitat Greuel)

Nein nein Nein. Verwenden Sie nicht kill -9.

Es gibt dem Prozess keine Chance, sauber:

1) Sockelverbindungen abschalten

2) Bereinigen Sie temporäre Dateien

3) informieren Sie seine Kinder, dass es weggeht

4) Setzen Sie die Klemmeneigenschaften zurück

und so weiter und so weiter 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 die Binärdatei, da sich das Programm schlecht verhält!

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

Nur eine weitere nutzlose Nutzung des Usenets,

(.Unterschrift)

230
Shawn J. Goff

Es sollte immer in Ordnung sein, kill -9, genau wie es immer in Ordnung sein sollte, durch Ziehen am Netzkabel herunterzufahren. Es mag unsozial sein und eine gewisse Erholung hinterlassen, aber es sollte funktionieren und ist ein Elektrowerkzeug für Ungeduldige.

Ich sage dies als jemand, der zuerst versucht, einfach zu töten (15), weil es einem Programm die Möglichkeit gibt, eine Bereinigung durchzuführen - vielleicht nur in ein Protokoll zu schreiben, das "auf Sig 15 beendet" wird. Aber ich werde keine Beschwerde über schlechtes Benehmen bei einem Kill -9 akzeptieren.

Der Grund: Viele Kunden tun es mit Dingen, die Programmierer lieber tun würden als nicht. Random Kill-9-Tests sind ein gutes und faires Testszenario. Wenn Ihr System damit nicht zurechtkommt, ist Ihr System defekt.

77
dbrower

Ich benutze kill -9 ähnlich wie ich Küchengeräte in die Spülmaschine werfe: Wenn ein Küchengerät durch die Spülmaschine ruiniert wird, dann will ich es nicht.

Das Gleiche gilt für die meisten Programme (sogar Datenbanken): Wenn ich sie nicht töten kann, ohne dass die Dinge durcheinander geraten, 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 beibehalten, wenn dies nicht der Fall ist: Nun, ich denke, es ist Zeit, dass Sie darüber nachdenken, was Sie tun).

Denn in der realen Welt können Dinge jederzeit aus irgendeinem Grund untergehen.

Leute sollten schreiben Software, die tolerant gegenüber Abstürzen ist. Insbesondere auf Servern. Sie sollten lernen, wie Sie Software entwerfen, die davon ausgeht, dass Dinge kaputt gehen, abstürzen usw.

Gleiches gilt für Desktop-Software. Wenn ich meinen Browser herunterfahren möchte, muss AGES normalerweise heruntergefahren werden. Es gibt nichts mein Browser braucht, das sollte länger als höchstens ein paar Sekunden dauern. Wenn ich es zum Herunterfahren auffordere, sollte es das sofort schaffen. Wenn dies nicht der Fall ist, ziehen wir kill -9 heraus und schaffen es.

39
borud

Nicht in allen anderen Antworten erwähnt ist ein Fall, in dem kill -9 Überhaupt nicht funktioniert, wenn ein Prozess <defunct> Ist 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 gültig und warum wird er nicht getötet?

Bevor Sie also versuchen, kill -9 Einen <defunct> - Prozess auszuführen, führen Sie ps -ef Aus, um zu sehen, was sein Elternteil ist, und versuchen Sie es mit -15 (TERM) oder -2 (INT) und zuletzt -9 (KILL) auf seinem Elternteil.

Hinweis: was ps -ef Tut .

Spätere Bearbeitung und Vorsicht: Gehen Sie beim Beenden von Prozessen, deren Eltern oder Kindern vorsichtig vor, da sie möglicherweise geöffnete oder beschädigte Dateien lassen, Verbindungen unvollendet lassen oder beschädigt werden können Datenbanken usw. Wenn Sie nicht wissen, was kill -9 für einen Prozess tut, verwenden Sie ihn nur als letzten Ausweg. Wenn Sie kill ausführen müssen, verwenden Sie die oben angegebenen Signale, bevor Sie -9 (KILL) verwenden.

10

Mach niemals niemals ein kill -9 1. Vermeiden Sie es auch, bestimmte Prozesse wie mount` zu töten. Wenn ich viele Prozesse beenden muss (z. B. wenn eine X-Sitzung hängen bleibt 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

Beachten Sie, dass kill einen Prozess nicht stoppt und seine Ressourcen freigibt. Es wird lediglich ein SIGKILL-Signal an den Prozess gesendet. Sie könnten mit einem Prozess enden, der hängen bleibt.

6
HandyGandy

Das Abschalten von Prozessen ist kein reibungsloser Ablauf: Daten können verloren gehen, schlecht gestaltete Apps können sich auf subtile Weise selbst zerstören, die ohne eine Neuinstallation nicht behoben werden können. Es hängt jedoch völlig davon ab, zu wissen, was in einem sicher ist und was nicht gegebene Situation. und was wäre gefährdet. Der Benutzer sollte eine Vorstellung davon haben, was ein Prozess ist oder sein sollte und welche Einschränkungen er hat (Festplatten-IOPS, RSS/Swap) und in der Lage sein, abzuschätzen, wie viel Zeit ein lang laufender Prozess dauern sollte (z. B. eine Dateikopie, MP3-Neukodierung, E-Mail-Migration, Backup, [Ihr bevorzugter Zeitsenker hier].)

Darüber hinaus ist das Senden von SIGKILL an eine PID keine Garantie dafür, diese zu töten. Wenn es in einem Systemaufruf steckt oder bereits zombiert ist (Z in ps), wird es möglicherweise weiterhin zombiert. Dies ist häufig der Fall, wenn ^ Z ein lang laufender Prozess ist und bg vergessen wird, bevor versucht wird, kill -9 es. Ein einfaches fg verbindet stdin/stdout erneut und entsperrt wahrscheinlich den Prozess, normalerweise gefolgt vom Beenden des Prozesses. Wenn es an anderer Stelle oder in einer anderen Form des Kernel-Deadlocks hängen bleibt, kann der Prozess möglicherweise nur durch einen Neustart entfernt werden. (Zombie-Prozesse sind bereits tot, nachdem SIGKILL vom Kernel verarbeitet wurde (es wird kein weiterer Userland-Code ausgeführt). Es gibt normalerweise einen Kernel-Grund (ähnlich wie das "Blockieren", während auf einen Systemaufruf gewartet wird), damit der Prozess nicht abgeschlossen wird Beendigung.)

Wenn Sie einen Prozess und alle seine untergeordneten Elemente beenden möchten, gewöhnen Sie sich an, kill mit der negierte PID, nicht nur der PID selbst aufzurufen. Es gibt keine Garantie dafür, dass SIGHUP, SIGPIPE oder SIGINT oder andere Signale danach bereinigt werden und dass es ärgerlich ist, eine Reihe von abgelehnten Prozessen zu bereinigen (erinnern Sie sich an Mischling?).

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

5
dhchdhd

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 Erklärungen lesen. Zusammenfassend würde ich nur SIGTERM und SIGKILL oder sogar SIGTERM, SIGINT und SIGKILL empfehlen. Ich gebe jedoch mehr Optionen in der vollständigen Antwort.

Bitte zögern Sie nicht, es vom Github herunterzuladen (zu klonen) Repository zu killgracefully1

3
Dr Beco

Warum willst du nicht kill -9 ein Prozess normal

Gemäß man 7 signal:

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

Dies bedeutet, dass die Anwendung, die eines dieser Signale empfängt, sie nicht "abfangen" kann, um ein Abschaltverhalten auszuführen.

Was Sie tun sollten, bevor Sie kill -9 über einen Prozess

Stellen Sie Folgendes sicher, bevor Sie das Signal an den Prozess senden, dass Sie:

  1. Stellen Sie sicher, dass der Prozess nicht beschäftigt ist (dh "Arbeit" erledigt); Senden eines kill -9 zum Prozess führt im Wesentlichen zum Verlust dieser Daten.
  2. Wenn es sich bei dem Prozess um eine nicht reagierende Datenbank handelt, 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.
3
user26053