Frage Wie kann ich alle gestoppten Jobs erledigen?


Wenn ich versuche, meinen Linux-Server zu verlassen, erhalte ich folgende Meldung:

Es gibt abgebrochene Jobs.

: Gibt es einen einzigen Befehl, um diese zu töten?


80
2018-02-25 10:07


Ursprung


Weitere Beispiele in der U & L Q & A: unix.stackexchange.com/questions/124428/... - slm
Ich hatte jetzt ein umgekehrtes Problem, es warnte nicht vor abgebrochenen Jobs, wenn ich die Shell verließ! Musste setzen shopt -s checkjobs in meiner .bashrc - Sam Watkins
Drücken Sie erneut ctrl + d, damit Sie jetzt beenden und diese Jobs löschen können - Jens Timmerman


Antworten:


Um schnell alle Jobs zu beenden, die unter der Bash ausgeführt werden, geben Sie Folgendes ein:

kill `jobs -ps`

jobs -ps listet die Prozess-ID der angehaltenen Jobs auf. kill `jobs -ps` Sende TERM-Signal an alle gestoppten Jobs.


69
2018-02-25 10:15



-1 für "kill Jobs" - Tibor
hat nicht funktioniert, als der Job "sudo su" war. d.h. sudo kill `jobs -p` hat nicht funktioniert, aber PID explizit eingeben. - user13107
Warum wird das so hoch bewertet? Es ist falsch. Wenn die Prozesse gestoppt werden, dann a kill So wie dies nichts tun wird, da die Prozesse gestoppt werden, werden sie das SIGTERM (-15), das ihnen standardmäßig gesendet wird, nicht verarbeiten. - slm
kill -9 wird den Trick machen. - Blossoming_Flower
Klar falsche Antwort! - mrangry777


Versuchen Sie Folgendes einzugeben:

kill -9 $(jobs -p)

76
2018-02-25 10:14



Das sollte es tun, aber ich denke, er sollte zuerst ein SIGTERM (-15) senden, bevor er ein SIGKILL sendet (-9). Also vielleicht etwas wie "kill $ (jobs-p); schlafen 3s; kill -9 $ (jobs -p)" wäre besser. Wenn SIGTERM zuerst gesendet wird, können die Jobs möglicherweise einen sauberen Exit ausführen (freigegebene Ressourcen usw.). - rems
Kevin Duke, deine Antwort ist diejenige, die für mich funktioniert hat. Ich konnte nicht wählen, weil ich keinen 15 Ruf habe. kill -9 $ (jobs -p)
@rems Außer, wie slm darauf hingewiesen hat, werden sie das SIGTERM nicht bekommen, weil sie gestoppt sind. - Paul Gear
Funktioniert nicht auf zsh. Durch zsh ist nicht POS  IX konform mit Jobs. - Max Coplan


Die akzeptierte Antwort würde alle Jobs töten (was in diesem Fall ausreichend ist) und nicht nur die gestoppten. Solltest du nur die Stopped töten wollen, führe:

kill $(jobs -l | grep Stopped | cut -d' ' -f3)

16
2018-03-08 18:04



grep / cut kann in einem awk Befehl kombiniert werden: awk '/Stopped/{print $3}') - laebshade
das -s Argument auf der akzeptierten Antwort filtert nur die gestoppten - 79E09796


Der einfachste Weg ist, den Ausgang einfach sofort erneut zu versuchen; bash Das bedeutet, dass "alle gestoppten Jobs beendet und beendet werden".


12
2018-03-08 18:13



Das wird eine HUP senden, die nicht unbedingt alle Jobs stoppt. - Stephen Niedzielski


for x in `jobs -p` ; do kill -9 $x ; done

7
2018-02-26 10:22



Sie können Codeformatierung für diese Zeile hinzufügen, um das Lesen zu erleichtern. - drcelus
Sehen Sie sich die Formatierung noch einmal an - verwenden Sie vier Leerzeichen am Anfang der Zeile, um einen Block als Code zu markieren (anstatt den Backtick zu verwenden). Im Moment ist es nicht klar, ob Sie Backticks in Ihrem Code verwenden oder versuchen, Code mit Backticks anzuzeigen. - dunxd
Die Formatierung ist in Ordnung. Wir müssen die Jobs -p mit Backticks übergeben, sonst wird es nicht als Befehl betrachtet, und es wird einen Fehler auslösen. - monu


Wenn Sie einige gestoppte Jobs entfernen möchten, aber nicht alle, versuchen Sie Folgendes:

Erstens, listet Jobs auf, Sie erhalten etwa Folgendes:

$ jobs -l

[2]   4813 Stopped                 ./parse < call.txt
[3]-  4819 Stopped                 ./parse < call.txt

Senden Sie Kill an einen angehaltenen Job, es wird nur die Warteschlange ausgeführt als es im Vordergrund bringen, wird es enden

$ fg %2
./parse < call.txt
Terminated

$ jobs -l
[3]-  4819 Stopped                 ./parse < call.txt

4
2018-05-30 04:16





Normalerweise, wenn Sie diese Nachricht erhalten haben, müssen Sie sich zweimal abmelden. Z.B. zuerst Strg + D gibt Ihnen die Warnmeldung, um Sie über gestoppte Jobs zu informieren. Wenn Sie zum zweiten Mal drücken, werden Sie ausgeloggt. Dies gilt auch für logout und exit Befehle.

Um sie manuell zu beenden, versuchen Sie Folgendes: kill $(jobs -p).


Wenn Sie Jobs nicht aus Ihrer aktuellen Shell entfernen möchten, können Sie sie aus der Tabelle der aktiven Jobs entfernen, ohne sie zu töten disown Befehl. Z.B.

$ sleep 1000 &
[1] 19404
$ jobs
[1]+  Running                 sleep 1000 &
$ disown

Gestoppte Jobs können auch vom Status des Prozesses bestimmt werden (T Zeichen), was bedeutet, dass der Prozess durch ein Signal wie z SIGSTOP, SIGTSTP oder andere (wie SIGTTIN, oder SIGTTOU).

Für den Fall, wenn jobs Ein Shell-Builtin-Befehl ist nicht verfügbar, gestoppte Prozesse können mit dem folgenden Befehl aufgelistet werden:

ps wuax | awk '$8 ~ "T"'

Um sie alle zu töten, kannst du grundsätzlich tippen:

kill -9 $(ps wuax | awk 'NR>1 && $8 ~ "T" {print $2}')

Hier ist ein einfacher Test:

$ sleep 1000 &
[1] 2014
$ sleep 1000 &
[2] 2015
$ sleep 1000 &
[3] 2016
$ sleep 1000 &
[4] 2017
$ killall -STOP sleep
[1]   Stopped                 sleep 1000
[2]   Stopped                 sleep 1000
[3]   Stopped                 sleep 1000
[4]   Stopped                 sleep 1000
$ ps wuax | awk '$8 ~ "T"'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
vagrant   2014  0.0  0.0   7228   832 pts/0    T    20:38   0:00 sleep 1000
vagrant   2015  0.0  0.0   7228   708 pts/0    T    20:38   0:00 sleep 1000
vagrant   2016  0.0  0.0   7228   760 pts/0    T    20:38   0:00 sleep 1000
vagrant   2017  0.0  0.0   7228   828 pts/0    T    20:38   0:00 sleep 1000
$ kill -9 $(awk 'NR>1 && $8 ~ "T" {print $2}' <(ps wuax))
$ jobs
[1]   Killed                  sleep 1000
[2]   Killed                  sleep 1000
[3]   Killed                  sleep 1000
[4]   Killed                  sleep 1000

4
2018-02-19 20:46





Nur für den Fall, dass dies jemand anderem hilft - die meisten Leute sind hier, weil sie einige gestoppte Prozesse haben, die sie gestartet haben, vielleicht über die Shell. Ich musste Prozesse finden, als root, von anderen Benutzern gestoppt, für welche Varianten auf der jobs Befehl wird nicht tun.

Ein bisschen herumgraben mit man ps hat mich dazu gebracht:

ps -a -o pid,user,cmd,state | grep 'T$'

Erklärung: die -a Flag sagt dann zeige alle Prozesse -o steuert die Ausgabe, welche Informationen zu jedem Prozess angezeigt werden. Ich wähle pid, user, cmd (die Befehlszeile), und state, das ist die Prozessstatus.

Von man ps:

PROCESS STATE CODES
   Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the
   state of a process:
           D    uninterruptible sleep (usually IO)
           R    running or runnable (on run queue)
           S    interruptible sleep (waiting for an event to complete)
           T    stopped, either by a job control signal or because it is being traced
           W    paging (not valid since the 2.6.xx kernel)
           X    dead (should never be seen)
           Z    defunct ("zombie") process, terminated but not reaped by its parent

so pipere ich es endlich an grep T$ was sagt, zeige mir alle Prozesse, die T in der letzten Spalte haben.

Und dann habe ich eine schöne Liste aller Prozesse von verschiedenen Benutzern, die im gestoppten Zustand sind.

$ ps -a -o pid,user,cmd,state | grep 'T$'
  865 joson74+ python                      T
  885 joson74+ sh -c less                  T
  886 joson74+ less                        T
 1014 minames+ python3.4 -i /home/minames  T
 5352 MooKo    nano stdio.h                T
 7851 harry    tmux attach                 T
12083 harry    tmux attach                 T
13495 gorylla+ python3.4 -i /home/gorylla1 T
18009 conr1d   vim                         T
19664 enythin+ python                      T
24906 wardlist python                      T

4
2018-02-26 06:47



Um Jobs anzuhalten, die an die aktuelle Shell angehängt sind, jobs -ps ist einfacher als diese Antwort. Davon abgesehen zeigt diese Antwort nicht nur Jobs, die über gestoppt wurden Ctrl-Z in einer Muschel, aber alle gestoppten Jobs: andere Shells, andere Benutzereinschließlich Jobs, die debuggt werden (z. B. durch gdb). - Stéphane Gourichon