Ctrl+ Cfunktioniert nicht immer, um den aktuellen Prozess abzubrechen (zum Beispiel, wenn dieser Prozess bei bestimmten Netzwerkoperationen beschäftigt ist). In diesem Fall sehen Sie nur "^ C" an Ihrem Cursor und können sonst nicht viel tun.
Was ist der einfachste Weg, um diesen Prozess zum Abbruch zu zwingen, ohne mein Terminal zu verlieren?
Zusammenfassung der Antworten:
Normalerweise können Sie Ctrl+ Zden Prozess in den Ruhezustand versetzen und dann tun kill -9 _process-pid_
, wo Sie die pid des Prozesses mit ps und anderen Tools finden. Auf Bash (und möglicherweise anderen Shells) können Sie kill -9 %1
(oder '% N' im Allgemeinen) das einfacher machen. Wenn Ctrl+ Znicht funktioniert, werden Sie einen anderen Terminal und öffnen Sie müssen töten von dort.
screen
wäre eine mögliche Lösung, mit der Sie ein neues Fenster erstellen undkill
den Vorgang von dort aus starten können.Antworten:
Um das Problem zu verstehen, warum Ctrl+ Cnicht funktioniert, ist es sehr hilfreich zu verstehen, was passiert, wenn Sie darauf drücken:
Die meisten Schalen binden Ctrl+ Cauf „ein senden SIGINT Signal an das Programm , das zur Zeit im Vordergrund ausgeführt wird “. Über die verschiedenen Signale können Sie per Man-Signal lesen :
Programme können dieses Signal ignorieren, da sie auch SIGTSTP ignorieren können :
(Was ist, was die meisten Muscheln tun, wenn Sie Ctrl+ drücken Z, weshalb es nicht garantiert funktioniert.)
Es gibt einige Signale, die vom Prozess nicht ignoriert werden können: SIGKILL , SIGSTOP und einige andere. Sie können diese Signale über den Befehl kill senden . Um Ihren Prozess des Aufhängens / Zombies zu beenden, suchen Sie einfach die Prozess-ID (PID). Verwenden Sie zum Beispiel
pgrep
oderps
und dannkill
Folgendes:quelle
Z
Status ( ). In diesem Fall kann er keine Signale mehr verarbeiten.)Wenn Ctrl+ C(SIGINT) nicht funktioniert, versuchen Sie es mit Ctrl+ \(SIGQUIT). Dann versuchen Sie es mit Ctrl+ Z(SIGTSTP). Wenn Sie zu einer Shell-Eingabeaufforderung zurückkehren, geben Sie
kill
die Prozess-ID ein. (Dies ist der Standardwert für das SIGTERM-Signal, das Sie mit angeben könnenkill -TERM
. In einigen Shells können Sie möglicherweise%1
auf die PID verweisen.) Wenn dies nicht funktioniert, wechseln Sie zu einem anderen Terminal oder einer anderen SSH-Sitzung und führen Siekill
oderkill -TERM
auf Prozess ID. Dies sollten Sie nur als letzten Ausweg tunkill -KILL
,kill -9
da es dem Prozess keine Möglichkeit gibt, sauber abzubrechen, seine geöffneten Dateien zu synchronisieren, seine temporären Dateien zu entfernen, Netzwerkverbindungen zu schließen usw.quelle
Drücken Sie Strg-Z, um das Programm anzuhalten und in den Hintergrund zu stellen :
(Wiederherstellen in den Vordergrund mit
fg
)Dann können Sie
kill
oderkill -9
es unter Angabe der Prozess-ID (von der Sie die erhaltenps a
).quelle
kill $!
, ebenso wie$!
mit einer speziellen Variablen, die pid des zuletzt hinterlegten Programms enthalten.bg
einmal machen, bevor der Variablen ein Wert zugewiesen wird.bg
direkt nach Strg + Z nur noch Suspendiert zu werden.ps
output (oderkillall
) ist ziemlich riskant, wenn mehrere Prozesse mit demselben Namen ausgeführt werden.ps -e -o pid,command
liefert pid + full args, nicht nur den Programmnamen, sondern reicht möglicherweise auch nicht aus, um zu unterscheiden. Im Gegensatz dazu$!
ist ein sicherer Treffer.ps a
auf meinem System:27721 s000 T 0:00.09 top
Wie viele angehaltene (T
glaube ich) Instanzen desselben Befehls (top
) haben Sie im selben tty (s000
) ausgeführt?Siehe auch diesen Link .
Ctrl+ Z: pausiere einen Prozess.
Ctrl+ C: Bitte höflich darum, dass der Prozess jetzt beendet wird.
Ctrl+ \: Beende gnadenlos den Prozess, der gerade im Vordergrund steht
quelle
"ctrl"
+"\"
hat bei mir nicht funktioniertNormalerweise können Sie den Vorgang immer noch stoppen ( Ctrl+ Z) und dann verwenden
kill -9
. Dafürkill -9
benötigen Sie zuerst die Prozess-PID . Bei Hintergrundjobskill -9 %1
ist dies die einfachste Methode. Wenn Sie sich nicht sicher sind, wie viele Hintergrundjobs Sie beenden möchten, führen Sie sie ausjobs
.Alternativ finden Sie die Prozess-ID mit
Dann kannst du rennen
quelle
Eine einfachere Lösung für Bash (und andere Shells?) Ist:
wobei sich '% 1' auf die Jobnummer bezieht, die getötet wird. Möglicherweise ist es '% 2' (oder etwas anderes), wenn Sie bereits andere Jobs haben, die schlafen. Sie können sehen, um welche Auftragsnummer es sich handelt, wenn Sie Strg-Z drücken:
Beachten Sie, dass 'kill' die Shell-Version von kill ist, nicht / bin / kill.
quelle
1) Wenn Sie sich in der Konsole befinden und sich im Mehrbenutzermodus befinden, können Sie STRG-ALT-Fn drücken und sich auf einem anderen Bildschirm anmelden,
ps -ef | grep <myprocessname>
oder verwendenpidof <myprocessname>
und dann -9 den Prozess anhand der ID-Nummer beenden.2) Wenn Sie eine Remoteverbindung haben, tun Sie dasselbe über eine andere Terminalsitzung.
Sie können das Leben auch ein wenig erleichtern, indem Sie htop installieren , eine vielseitigere Version von top, mit der Sie laufende Prozesse selektiv beenden können. Die meisten Distributionen haben ein Repo.
3) Wenn Sie sich gerade in einer blockierten SSH-Sitzung befinden (z. B. auf einem anderen System), versuchen Sie, die Escape-Taste Tilde (~) zu drücken, und drücken Sie dann STRG-Z, um zur Host-Sitzung zurückzukehren kann den stecken gebliebenen ssh-prozess beenden oder auf ein Timeout warten, was die meisten nach einer Zeit der Inaktivität tun.
quelle
Wenn Sie tmux oder screen verwenden und keines der oben genannten
<prefix> x
Verfahren funktioniert, können Sie den Bereich trotzdem mit beenden. Der Vorgang wird dann ebenfalls beendet.quelle
Möglicherweise befindet sich in Ihrem / etc / profile eine mit SIGINT (2) gesetzte Falle. Wenn ja, entfernen Sie es. Melden Sie sich ab und wieder an und Sie sollten gut sein.
quelle