Frage Was tun, wenn Strg + C einen Prozess nicht beenden kann?


Strg + C funktioniert nicht immer, um den aktuellen Prozess zu beenden (zum Beispiel, wenn dieser Prozess in bestimmten Netzwerkoperationen beschäftigt ist). In diesem Fall sehen Sie einfach "^ C" mit Ihrem Cursor und können nicht viel mehr tun.

Was ist der einfachste Weg, um diesen Prozess zu erzwingen, um jetzt zu sterben, ohne mein Terminal zu verlieren?

Zusammenfassung der Antworten: Normalerweise können Sie das tun Strg + Z um den Prozess in den Schlaf zu bringen und dann zu tun kill -9 _process-pid_, wo Sie die PID des Prozesses finden ps und andere Werkzeuge. Auf Bash (und möglicherweise andere Shells), können Sie tun kill -9 %1 (oder "% N" im Allgemeinen), das ist einfacher. Ob Strg + Z funktioniert nicht, Sie müssen ein anderes Terminal öffnen und töten von dort.


139
2018-02-09 08:49


Ursprung


screen wäre eine mögliche Lösung, die es Ihnen erlaubt, ein neues Fenster zu erstellen und kill der Prozess von dort. - Bobby
vorausgesetzt du warst schon auf einem Bildschirm :) - Dustin Boswell


Antworten:


Um das Problem warum zu verstehen Strg + C funktioniert nicht, es ist sehr hilfreich zu verstehen, was passiert, wenn Sie es drücken:

Die meisten Muscheln binden Strg + C "senden a SIGINT signalisieren Sie dem Programm, das gerade im Vordergrund läuft. "Sie können über die verschiedenen Signale nachlesen Mannsignal:

 SIGINT        2       Term    Interrupt from keyboard

Programme können dieses Signal ignorieren, da sie ignorieren können SIGTSTP auch:

 SIGTSTP   18,20,24    Stop    Stop typed at tty

(Was die meisten Shells tun, wenn du drückst Strg + Zdeshalb funktioniert es nicht garantiert.)

Es gibt einige Signale, die von dem Prozess nicht ignoriert werden können: SIGKILL, SIGSTOP und einige andere. Sie können diese Signale über die. Senden töten Befehl. Also, um Ihren hängenden / zombieartigen Prozess zu beenden, finden Sie einfach die Prozess ID (PID). Zum Beispiel, verwenden pgrep oder ps und dann kill es:

 % kill -9 PID

101
2018-02-09 09:13



Eine bloße Bemerkung. Pass auf, dass "Zombie" technisch gesehen ein Prozesszustand ist, und es ist nicht das Gleiche wie das, was du hier unter "Zombieying" verstanden hast. (Ein beendeter Prozess, der von seinem Elternteil nicht gewartet () wurde, ist in Zombie (Z) Zustand. In diesem Fall kann es Signale nicht mehr verarbeiten.) - Stéphane Gimenez
leider, manchmal Strg + C, Strg + Z, und Strg + \ alle nichts tun, und der Prozess läuft Sudo rückgängig (erlaubt ohne ein Passwort), so dass Sie nicht einfach ein Signal an den Prozess senden können. - Michael


Ob Strg+C (SIGINT) funktioniert nicht, versuchen Sie es Strg+\ (SIGQUIT). Dann versuche es Strg+Z (SIGTSTP). Wenn das zu einer Shell-Eingabeaufforderung zurückkehrt, mach das kill auf der Prozess-ID. (Dies ist standardmäßig das Signal SIGTERM, das Sie mit angeben können kill -TERM. In einigen Shells können Sie möglicherweise verwenden %1 auf die PID beziehen.) Wenn das nicht funktioniert, gehen Sie zu einem anderen Terminal oder SSH-Sitzung und tun kill oder kill -TERM auf der Prozess-ID. Nur als letzter Ausweg solltest du tun kill -KILLa.k.a. kill -9, da es dem Prozess keine Chance gibt, sauber abzubrechen, seine geöffneten Dateien zu synchronisieren, seine temporären Dateien zu entfernen, Netzwerkverbindungen zu schließen usw.


90
2018-02-09 09:36





Drücken Sie Strg-Z bis setze das Programm aus und setze es in den Hintergrund:

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!

(Mit den Tasten wieder in den Vordergrund stellen fg)

Dann kannst du kill oder kill -9 es, angesichts seiner Prozess-ID (Sie bekommen das von ps a).


26
2018-02-09 08:53



Mit Bash können Sie kill $!, wie $! ist eine spezielle Variable, die die PID des letzten Hintergrundprogramms enthält. - Lloeki
@Lloeki Funktioniert bei mir nicht (zumindest nicht zuverlässig). Ich muss bg Einmal wird der Variablen ein Wert zugewiesen. - Daniel Beck♦
@Daniel, richtig. Es ist wie gesagt das letzte hintergründig Prozess, also braucht bg wie direkt nach Strg + Z ist es nur ausgesetzt. - Lloeki
Hinweis: Dies ist nicht nur ein Trick, mit ps Ausgabe (oder killall) ist ziemlich riskant, wenn mehrere Prozesse mit demselben Namen ausgeführt werden. ps -e -o pid,command wird pid + volle args zur Verfügung stellen, nicht nur den Programmnamen, aber vielleicht auch nicht genug, um zu unterscheiden. Im Gegensatz $! ist ein sicherer Erfolg. - Lloeki
@Lloeki stimme ich nicht zu. Beispiel Ausgangszeile von ps a auf meinem System: 27721 s000 T 0:00.09 top Wie viele ausgesetzt (T, Denke ich) Instanzen desselben Befehls (top) Hast du im selben tty (s000) - Daniel Beck♦


Sieh dir das an Verknüpfung auch.

Strg+Z: pausiere einen Prozess.

Strg+C: Bitte höflich, den Prozess jetzt abzuschalten.

Strg+\: Erbarme den Prozess, der gerade im Vordergrund ist, gnadenlos


21
2018-06-19 03:03





Normalerweise können Sie den Vorgang noch stoppen (Strg + Z) und dann benutzen kill -9. Zum kill -9, du brauchst das Prozess-PID zuerst. Für Hintergrundjobs, kill -9 %1 ist der einfachste Weg, um es zu tun - wenn Sie nicht sicher sind, welche Anzahl von Hintergrund-Job Sie töten möchten, führen Sie jobs.

Alternativ können Sie die Prozess-ID mit finden

ps

Dann kannst du rennen

kill -9 <Appropriate PID from ps output>

10
2018-02-09 08:53





1) Wenn Sie auf der Konsole und im Multi-User-Modus sind, können Sie STRG-ALT-Fn drücken und sich auf einem anderen Bildschirm anmelden, verwenden ps -ef | grep <myprocessname> oder pidof <myprocessname> und dann kill -9 den Prozess nach ID-Nummer.

2) Wenn Sie remote verbunden sind, führen Sie dasselbe über eine andere Terminalsitzung durch.

Sie könnten auch das Leben ein wenig einfacher machen, indem Sie installieren htopDies ist eine vielseitige Version von top, mit der Sie laufende Prozesse selektiv beenden können. Die meisten Distributionen haben htop in einem Repo.

3) Wenn Sie gerade in einer gehangenen SSH-Sitzung stecken (zum Beispiel zu einem anderen System), versuchen Sie Tilde (~) zu drücken, was die Escape-Taste ist, und drücken Sie dann STRG-Z, um zur Host-Sitzung zurückzukehren kann den festgefahrenen SSH-Prozess beenden oder darauf warten, dass es nach einer gewissen Zeit der Inaktivität abläuft.


4
2018-02-09 09:01





Eine einfachere Lösung für Bash (und andere Shells?) Ist zu tun:

Ctrl-z      followed by     kill -9 %1

wobei '% 1' sich auf die Jobnummer bezieht, die getötet wird. Es könnte "% 2" (oder etwas anderes) sein, wenn Sie bereits andere Jobs haben, die schlafen. Sie können sehen, welche Jobnummer es ist, wenn Sie Strg-z drücken:

[1]+  Stopped                 <process name>

Beachten Sie, dass "kill" die Shell-Version von kill ist, nicht / bin / kill.


3
2018-04-18 10:41