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 2200
wo 2200 meine PID ist und der Prozess nicht beendet wird. Nach wenigen Minuten ist noch Warten im top
und 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 fg
Prozessliste 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
command-line
process
Patryk
quelle
quelle
top
(wie in der Bearbeitung aufgeführt). Ich wollte nur versuchen, das Programm in den Hintergrund zu stellen und es dann zurückzubringen.fg
oderbg
für den ProzessAntworten:
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:
Weitere Informationen finden Sie auf der Handbuchseite:
quelle
kill -9
nicht funktioniert und der Prozess noch nicht abgeschlossen ist?Wird
kill
es 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 sogarkill -9
der Prozess nicht beendet wird. Zum Beispiel, wenn ein Prozess den Status hatD
(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.quelle
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]
.quelle
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.
quelle
In C ++ habe ich ausgeführt:
Und auf einem Linux (Ubuntu) Terminal,
Die Ausgabe war:
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!
quelle
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.quelle
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
wo
3348
ist pid des laufenden Prozessesquelle