"Kill <PID>" beendet den Prozess nicht wirklich, warum?

118

Ich versuche, meine Befehlszeilenfähigkeiten zu verbessern, und bin auf ein Problem gestoßen, bei dem ich einen Prozess nicht beenden kann. Ich gebe ein, kill 2200wo 2200 meine PID ist und der Prozess nicht beendet wird. Nach wenigen Minuten ist noch Warten im topund ps aux. Ich habe sogar versucht, es mit sudo zu tippen - keine Ergebnisse.

Irgendwelche Ideen, warum es so sein würde?


BEARBEITEN

Ich habe eine seltsame Abhängigkeit gefunden, bei der die fgProzessliste aktualisiert wird:

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2202 pts/0    00:00:00 top
 2258 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2200 pts/0    00:00:00 top
 2620 pts/0    00:00:00 ps
x@xxx:/etc/grub.d$ fg
top

x@xxx:/etc/grub.d$ ps
  PID TTY          TIME CMD
 1723 pts/0    00:00:00 bash
 2621 pts/0    00:00:00 ps
Patryk
quelle
Welcher Prozess war das? Haben Sie überprüft, ob der Prozess möglicherweise fehlgeschlagen ist ? In diesem Fall müssen Sie den übergeordneten Prozess beenden.
htorque
Der Prozess ist top(wie in der Bearbeitung aufgeführt). Ich wollte nur versuchen, das Programm in den Hintergrund zu stellen und es dann zurückzubringen.
Patryk
2
Wenn Sie einen Prozess mit STRG-Z anhalten, werden die meisten Signale so lange blockiert, wie sie angehalten werden (dh bis Sie einen fgoder bgfür den Prozess
Nr.

Antworten:

179

Prozesse können einige Signale ignorieren. Wenn Sie SIGKILL senden, kann es nicht ignoriert werden (und es kann auch nicht abgefangen werden, um Aufräumarbeiten durchzuführen). Versuchen:

kill -9 {PID}

Weitere Informationen finden Sie auf der Handbuchseite:

man kill
Michał Šrajer
quelle
22
Beachten Sie auch, dass sich ein Prozess unter bestimmten Umständen in einem Zombie- / Nicht-Status befinden kann, den auch SIGKILL nicht beenden kann. In diesem Fall müssen Sie den übergeordneten Prozess suchen und den übergeordneten Prozess beenden.
Lie Ryan
15
Wenn dieser Prozess aus der Reihe gerät, ist es KILL DASH NINE !
Scottl
4
Und manchmal gibt es keinen übergeordneten Prozess. In diesem Fall sind Sie einfach beschissen. Die einzige Möglichkeit, einen solchen Prozess zu entfernen, besteht darin, den Computer neu zu starten.
user606723
2
Der Name des Befehls kill ist für viele, viele Benutzer (auch für mich am Anfang) weiterhin irreführend. Man geht davon aus, dass wenn Sie "X töten" sagen, dies bedeutet, dass Sie das X wirklich töten und nichts anderes tun. Ich verstehe, dass dies nichts ändern wird, aber ich wünschte, sie hätten einen ausführlicheren Namen gewählt ...
rbaleksandar
1
Was tun, auch wenn es danach kill -9nicht funktioniert und der Prozess noch nicht abgeschlossen ist?
Douglas Gaskell
42

Wird killes ohne Parameter aufgerufen, sendet es die Signalnummer 15 ( SIGTERM). Dieses Signal kann vom Prozess ignoriert werden. Dieses Signal benachrichtigt den Prozess, um seine Sachen aufzuräumen und dann von ihm selbst korrekt zu beenden. Das ist der schöne Weg.

Sie können auch die Signalnummer 9 ( SIGKILL) "senden", die vom Prozess nicht ignoriert werden kann. Der Prozess wird es nicht einmal erkennen, da der Kernel den Prozess beendet, nicht den Prozess selbst. Das ist der böse Weg.

Man sagt kill -9 <pid>immer funktioniert. Das ist ein Irrglaube . Es gibt Situationen, in denen sogar kill -9der Prozess nicht beendet wird. Zum Beispiel, wenn ein Prozess den Status hat D(unterbrechungsfreier Schlaf). Ein Prozess wird jedes Mal in diesen Zustand versetzt, wenn er auf E / A wartet (normalerweise nicht sehr lange). Wenn ein Prozess auf E / A wartet (z. B. auf einer defekten Festplatte) und nicht richtig programmiert ist (mit einer Zeitüberschreitung), können Sie den Prozess einfach nicht beenden . Egal was du tust. Sie können nur versuchen, die Datei zugänglich zu machen, damit der Vorgang fortgesetzt wird.

Chaos
quelle
2
Dies ist sehr hilfreich. Ich habe dies mehrmals erlebt, weil ich den E / A-Zugriff auf Netzwerklaufwerke gehängt habe, und ich habe mich gefragt, warum ich eingefrorene Prozesse nicht beenden konnte. Gibt es mehr Dokumentation zu diesem speziellen Thema und wie kann man es umgehen?
Sheljohn
7

Obwohl der Name kill Prozesse nicht wirklich beendet, sendet er Signale an sie. Von der Manpage:

kill - send a signal to a process

Das von gesendete Standardsignal kill [pid]ist SIGTERM, das den Prozess normalerweise, aber nicht unbedingt zum Beenden auffordert . Es ist durchaus möglich, ein Programm zu schreiben, das eine fröhliche Melodie wiedergibt, wenn Sie das SIGTERM- Signal an das Programm senden , dies wird jedoch nicht empfohlen.

Ein weiteres häufiges Signal ist SIGHUP, das häufig verwendet wird, um ein Programm zum erneuten Lesen seiner Konfigurationsdateien aufzufordern.

Wenn Sie ein Programm wirklich beenden möchten, müssen Sie das SIGKILL- Signal verwenden kill -9 [pid].

danne
quelle
2

Es hört sich so an, als würden Sie einen Prozess anhalten (möglicherweise durch Drücken von Strg-Z im Terminal). In diesem Zustand reagiert Ihr Prozess nicht auf ein SIGTERM, da es eingefroren ist. Das Ausführen von 'fg' taut den Prozess auf, sodass er das Signal auffangen und sich selbst beenden kann. Das könnte erklären, warum 'fg' angezeigt wird, um die Prozessliste zu aktualisieren.

user24497
quelle
1
So wie man angebrachtes Terminal findet?
RuX
0

In C ++ habe ich ausgeführt:

kill(4024, SIGKILL);

Und auf einem Linux (Ubuntu) Terminal,

$ ps -ax | grep my_su

Die Ausgabe war:

4024 pts/1    Z+     0:00 [my_subscriber] <defunct>

Scheinbar überlebt es (4024) noch. Sobald ich jedoch den übergeordneten Prozess beendet habe, der die obige "kill" -Anweisung aufgerufen hat, wurde 4024 nicht mehr angezeigt. Jetzt beurteile ich, dass "nicht mehr funktionierender" Prozess nichts anderes als eine angezeigte Zeile ist und entscheide mich, diese zu ignorieren. Ich hoffe, meine Erfahrung konnte jemandem da draußen helfen. Prost!

Park JongBum
quelle
0

Sie können auch verwenden kill -l, um die von Ihrer Architektur unterstützten Signale anzuzeigen und mehr über das Signal zu erfahren, das Sie möglicherweise zum ordnungsgemäßen Senden eines Signals verwenden möchten.

Hinweis: Wie andere möglicherweise bereits erwähnt haben, wird die Verwendung von kill -9 {PID}nicht empfohlen, es sei denn, es handelt sich um einen Zombie-Prozess. Sobald ein Prozess ein SIGKILL erhält, wird er sofort ohne Reinigung oder andere geeignete Verfahren heruntergefahren.

amrx
quelle
0

Dies ist, was ich verwendet, um localhost läuft auf Port 80 Pille (von eckigen cli) Holen Sie sich App-Informationen auf Port 80 ausgeführt

sudo lsof -i tcp:80

After That 
sudo kill -9 3348

wo 3348ist pid des laufenden Prozesses

Aklesh Singh
quelle