töte -9 Programme, aber sie hängen immer noch

11

Ich habe versucht, alle meine zuvor unter KUbuntu eingereichten Hintergrundjobs von zu töten

kill -9 $(jobs -p)

Obwohl dieser Befehl sofort die Nachricht wie gab

[1] Myjob1 getötet

[2] Myjob2 getötet

Ich kann immer noch sehen, dass ihre Prozesse in der Ausgabe von top hängen und die CPU- und Speicherauslastung in der Ausgabe von Uptime und Free nicht geändert wird.

Also muss ich sie wohl nicht richtig getötet haben. Kann mir bitte jemand erklären, was mit mir passiert und was ich tun soll?

Ich fand oben heraus, dass ich, wenn ich k eingebe und die PID eingebe, die Prozesse einzeln beenden kann. Also unterscheidet sich das vom Befehl kill?

Ich habe auch irgendwo online http://www.ruhr.de/home/smallo/award.html gefunden, dass ich kill -9 nicht empfehle

Nutzlose Verwendung von Kill -9-Serienbrief

(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. Nehmen Sie den Mähdrescher nicht heraus, nur um den Blumentopf aufzuräumen.

Ist das wahr? Was bedeutet es mit "15 senden", "2 senden" und "1 senden"? Befehlen sie sich selbst oder "kill -15 PID", "kill -2 PID" und "kill -1 PID"?

Danke und Grüße!

Tim
quelle
Das Entfernen der Binärdatei (ausführbare Datei) beendet den Prozess an sich nicht. Das Dateisystem erkennt, dass der Prozess diese Datei verwendet, und lässt den Prozess die Datei "sehen", auch nachdem Sie sie entfernt haben.
Jeppe Stig Nielsen

Antworten:

9

Ihr Prozess ist wahrscheinlich tot, wird aber dennoch im Eintrag der Prozesstabelle angezeigt, da es sich um einen "Zombie-Prozess" handelt. Wenn ein untergeordneter Prozess beendet wurde und vollständig verschwand (mit Ausnahme seines Prozesstabelleneintrags) und der übergeordnete Prozess seinen Beendigungsstatus (über eine der Wartefunktionen) nicht abrufen konnte, wird er als Zombie bezeichnet ... Das Töten (durch Signal) eines Zombies wird nicht möglich arbeiten, weil es bereits beendet ist. Was Sie tun müssen, ist, den übergeordneten Prozess herauszufinden und diesen einen sauberen zu töten, ohne kill - 9 zu verwenden

Hier sind zwei einfache Schritte, um einen Zombie zu töten ...

  1. Wenn der Elternteil noch lebt, versuchen Sie ihn zu töten (oder SIGHUP ist alles, was Sie brauchen).
  2. Wenn Nummer 1 fehlschlägt, gibt es einen Fehler im Kernel .... Neustart ist dein Freund und behebe diesen Fehler: ->
nkr1pt
quelle
Ich reiche meine Jobs in der Kommandozeile und im Hintergrund ein. Was wären ihre Eltern? Und wie kann ich ihre Eltern finden, wenn überhaupt?
Tim
Verwenden Sie das -fFlag für ps, um die übergeordneten Prozesse anzuzeigen.
Jack M.
6

siehe man killfür eine Definition der verschiedenen verfügbaren Signale, aber ja.

  • 15 ist SIGTERM und fordert ein Programm zum Beenden auf.
  • 2 ist SIGINT und entspricht Control-C
  • 1 ist SIGHUP und zeigt an, dass das Terminal aufgelegt hat.

Diese informieren einen Prozess darüber, dass der Benutzer mit dem Prozess "fertig" ist, obwohl sie etwas andere Gründe angeben. SIGTERM kann als "Beenden der aktuellen Aufgabe, aber dann beenden; keine andere starten" interpretiert werden. SIGINT bedeutet "Verlassen, was Sie tun" tun und beenden ", bedeutet SIGHUP nur, dass niemand mehr zuhört (ein Serverprozess kann legitimerweise auf SIGHUP reagieren, indem er seine Konsolenausgabe abbricht und weiterläuft).

  • 9 ist SIGKILL und ist insofern besonders, als es das einzige ist, das der Prozess nicht intern erfassen und verarbeiten kann. Dies führt einfach dazu, dass der Kernel den Prozess niemals wieder kontrolliert und keine Chance mehr hat, ihn zu bereinigen.
Puetzk
quelle
Wenn Sie oben k eingeben und die PID eingeben, kann ich die Prozesse einzeln beenden. Entspricht dies also einigen Optionen für den Befehl kill?
Tim
Ja, top sendet nur ein Signal an den Prozess, genau wie kill. AFAICT, das Standardsignal, das top verwendet, ist 15 (SIGTERM).
Puetzk
1

Es bedeutet, stattdessen kill -15 PID(oder eine andere Nummer) zu verwenden kill -9 PID. Die Zahlen entsprechen verschiedenen Unix-Signalen .

Adriano Varoli Piazza
quelle
1

Dies bedeutet, dass Sie "kill -1" oder "kill -15" eingeben, anstatt "kill -9" einzugeben. Kill -9 ist eine Hardcore-Kugel im Kopf eines laufenden Prozesses. Sie tötet sie in einem schmutzigen Zustand, der dazu führen kann, dass Speicher verloren geht, bla bla.

Wenn Sie kill -9 eingeben und es nicht funktioniert, möchte ich sicherstellen, dass der Prozess nicht erneut ausgeführt wird und dass Sie die Berechtigung haben, diesen Prozess zu beenden.

Satanicpuppy
quelle
Wie würden Sie aussehen, um sicherzustellen, dass der Prozess nicht erneut ausgeführt wird? Habe ich die Erlaubnis, diesen Prozess abzubrechen, da ich die Prozesse besitze?
Tim
Es sollte eine andere Prozessnummer haben, wenn dies der Fall ist. Wenn Sie also ps -Al ausführen und processA sehen, beenden Sie -9 processA und dann ps -Al, und es befindet sich NOCH ein processA in der Prozesswarteschlange. Stellen Sie sicher, dass es sich um den gleichen processA handelt und nicht um einen neuen.
Satanicpuppy
Und es wird Ihnen sagen, wenn Sie keine Erlaubnis haben, den Prozess abzubrechen.
Satanicpuppy
0

Signal 9 ist SIGKILL. Das Senden eines SIGKILL fordert das Betriebssystem auf, den Prozess sofort abzubrechen, ohne dass Fragen gestellt werden. Der Prozess wird nicht im Voraus benachrichtigt und hat keine Chance, nach sich selbst aufzuräumen.

Signal 15 ist SIGTERM. Beim Senden eines SIGTERM wird das Betriebssystem aufgefordert, den Prozess zum Herunterfahren aufzufordern.

SIGKILL wird möglicherweise ignoriert, wenn das Betriebssystem glaubt, dass der Prozess E / A ausführt, oder wenn es sich um einen Zombie handelt (ein untergeordneter Prozess, dessen Eltern danach nicht aufgeräumt haben).

SIGTERM wird möglicherweise von der Anwendung ignoriert, es wird jedoch nicht empfohlen, dass Anwendungen dies tun, da Betriebssysteme SIGTERM während des Herunterfahrens senden, gefolgt von SIGKILL, wenn noch ein Programm ausgeführt wird.

Hinweis: Die Befehlszeile killfordert das Betriebssystem immer auf, ein Signal an die Anwendung zu senden. Dies kann je nach Eigentümer des Prozesses usw. geschehen oder nicht.

Powerlord
quelle