Wie kann ich einen feststeckenden Befehl auf dem Ubuntu-Server abbrechen?

11

Ich weiß, dass es ctrl+ gibt c, aber manchmal funktioniert das nicht. Auf dem Ubuntu-Desktop kann ich einfach das Terminalfenster schließen und in diesem Fall ein neues öffnen. Wie würde dies jedoch mithilfe der CLI auf dem Ubuntu-Server gelöst werden (ohne die Box neu zu starten)?

CrazeD
quelle

Antworten:

21

CTRL+Cwird SIGINTan die Anwendung senden . Die Anwendung kann einen Handler für dieses Signal konfigurieren oder das Signal ignorieren. Standardmäßig gibt es keinen Handler und SIGINTdie Anwendung wird beendet.

Sie können verwenden, CTRL+\welche senden SIGQUIT. Dies erzeugt auch einen Core-Dump, wenn das Core-Limit nicht Null ist.

Sie können den Prozess anhalten und mit zur Shell zurückkehren. Dadurch CTRL+Zwird die Ausführung des Prozesses gestoppt und zur Shell-Eingabeaufforderung zurückgekehrt. Der Prozess befindet sich im Speicher und ist als Job in der aktuellen Shell verfügbar. Sie können dann kill -SIGNAL %%oder verwenden kill -SIGNAL %<job_ID>, um ein Signal an diesen Job zu senden. ZB um den letzten Job zu tötenkill -9 %%

Wenn keiner von ihnen funktioniert, können Sie immer senden SIGTERM, als letzten Ausweg, SIGKILLder jeden Prozess beendet. Dieses Signal muss wie alle anderen Signale als derselbe Benutzer wie der Prozess, den Sie stoppen möchten, oder als Root gesendet werden. Um SIGKILLan den Prozess zu senden , suchen Sie zuerst den Prozess mit ps auxoder ps -edfund führen Sie ihn dann aus kill -SIGKILL <process_ID>, wobei dies <process_ID>die PIDSpalte in der psAusgabe ist.

Die Signale können nicht geliefert werden, wenn sich der Prozess in einem unterbrechungsfreien Anruf befindet. Unterbrechungsfreie Aufrufe sind Kernelfunktionen, die nicht gestoppt werden können und normalerweise aufgrund eines schlechten Treibers (z. B. eines nicht wiedereintretenden Treibers ) auftreten. Ein Prozess, der sich im ununterbrochenen Ruhezustand befindet, kann nicht gestoppt werden, bis der Anruf abgeschlossen oder der Server neu gestartet wurde.

Wenn ein Prozess zu einem Zombie wird , werden keine Ressourcen verwendet, die nur Platz in der Prozesstabelle beanspruchen. Ein Zombie-Prozess kann keine Signale empfangen.

Die Liste der Signale für die aktuelle Architektur finden Sie mit kill -l

Sehen Sie die man - Seiten von kill, psund bash. Um eine Manpage zu sehen, verwenden Sie Folgendes:man ps

Mircea Vutcovici
quelle
2

Wenn Sie vollen Konsolenzugriff haben, können Sie dies tun Alt- F1..12und eine neue Konsole erhalten.

Von dort aus können Sie eine Prozessliste wie folgt erstellen:

ps aux | grep <process-name>

Führen Sie dann eine killProzess-ID aus:

kill -9 <pid>

Wenn Sie keinen vollständigen Konsolenzugriff haben, öffnen Sie einfach ein anderes Terminalfenster (möglicherweise über PuTTY oder ähnliches) und führen Sie die oben beschriebenen Schritte aus, um die Schritte aufzulisten und zu beenden.

Labyrinth
quelle
1

Strg C sendet ein SIGINT an Ihren laufenden Prozess. Wenn Sie keine andere Konsole öffnen möchten, können Sie ein SIGQUIT mit Strg \ senden. Dies wird die meisten alltäglichen Apps ansprechen, die der SIGINT nicht tut.

Ich persönlich wollte einen Weg, um ein SIGKILL mit einer Verknüpfung zu senden, aber mir ist kein Weg bekannt, dies zu tun.

Tim Brigham
quelle
1

Ich halte pgrepund pkillsein einfacher zu bedienen als killmit einer expliziten Prozess - ID.

Anstatt mit Signal 9 (SIGKILL) zu beginnen, sollten Sie auch mit dem Standard-SIGTERM (15) beginnen. Dies gibt dem Prozess die Möglichkeit, ordnungsgemäß zu beenden (wenn dies möglich ist). pkill -15 thingund pkill thingsollte gleichwertig sein.

So würde das funktionieren. Angenommen, ntpd ist aufgehängt.

Was sind die Prozesse? (Sie können zu pkill springen, wenn Sie glauben, dass Sie keine falsch positiven Ergebnisse haben).

$ pgrep -fl ntp
1034 /usr/sbin/ntpd
1037 /usr/sbin/ntpd

Töte die Prozesse:

$ pkill ntpd

Verwenden Sie pgreperneut, um festzustellen, ob es erfolgreich war.

Wenn nicht, gehen Sie schließlich zu pkill -9.

belacqua
quelle
0

Sie würden zu einem neuen Terminal wechseln, die PID des steckengebliebenen Prozesses ermitteln (mit ps) und dann verwenden kill, um den Prozess abzubrechen. Ich würde zuerst verwenden kill (PID). Wenn das nicht funktioniert, würde ich verwenden kill -9 (PID). Wenn dies den Prozess nicht stoppt, muss der Computer neu gestartet werden.

Bill Weiss
quelle
0

Cntrl+ \arbeitete für mich (wo Cntrl+ coder znicht gearbeitet hat)

Vineeshvs
quelle