Come posso uccidere tutti i lavori interrotti?


91

Quando provo ad uscire dal mio server Linux ricevo il messaggio:

Ci sono lavori interrotti.

: C'è un solo comando per ucciderli?


Esempi aggiuntivi in ​​domande e risposte su domande e risposte
slm,

Ora avevo un problema opposto, non avvertivo dei lavori interrotti quando lasciai la shell! Ho dovuto inserire il shopt -s checkjobsmio .bashrc
Sam Watkins il

1
premi di nuovo ctrl + d, ti consentirà di uscire adesso, uccidendo quei lavori nel processo
Jens Timmerman,

Risposte:


73

Per terminare rapidamente tutti i lavori interrotti sotto la bash, immettere:

kill -9 `jobs -ps`

jobs -pselenca gli ID processo ( -p) dei -slavori arrestati ( ).
kill -9 `jobs -ps`invia segnali SIGKILL a tutti loro.


22
-1 per "kill Jobs"

1
non ha funzionato quando il lavoro era "sudo su". cioè non ha sudo kill `jobs -p`funzionato ma digitando esplicitamente PID ha fatto.
user13107,

14
Perché questo è così votato? È sbagliato. Se i processi vengono arrestati, un killtale non farà nulla, poiché i processi vengono arrestati, non elaboreranno il SIGTERM (-15) che viene inviato loro per impostazione predefinita.
slm,

6
uccidere -9 farà il trucco.
agenda del

84

Prova a digitare questo:

kill -9 $(jobs -p)

9
Questo dovrebbe farlo, ma penso che dovrebbe inviare prima un SIGTERM (-15) prima di inviare un SIGKILL (-9). Quindi forse proporre qualcosa come "kill $ (jobs -p); sleep 3s; kill -9 $ (jobs -p)" sarebbe meglio. Inviando prima SIGTERM i lavori potrebbero essere in grado di effettuare un'uscita pulita (liberando risorse allocate, ecc.).
ricorre il

3
Kevin Duke, la tua risposta è quella che ha funzionato per me. Non ho potuto votare perché non ho 15 in reputazione. kill -9 $ (jobs -p)

2
@rems Tranne, come sottolineato da slm, non otterranno SIGTERM perché sono fermi.
Paul Gear,


Quindi, come gestire zsh?
FX-Kirin

16

La risposta accettata ucciderebbe tutti i lavori (il che è sufficiente in questo caso) e non solo quelli interrotti. Se vuoi uccidere solo quelli fermati, esegui:

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

grep / cut possono essere combinati in un solo comando awk: awk '/Stopped/{print $3}')
laebshade,

2
l' -sargomento sulla risposta accettata filtra solo quelli bloccati
79E09796,

12

Il modo più semplice è in realtà semplicemente ritentare immediatamente l'uscita; bashciò significherà "uccidere tutti i lavori interrotti ed uscire".


4
Ciò invierà un HUP che non necessariamente interrompe alcun lavoro.
Stephen Niedzielski,

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

2
puoi aggiungere la formattazione del codice per questa riga per facilitarne la lettura.
drcelus,

Puoi dare di nuovo un'occhiata alla tua formattazione? Usa quattro spazi all'inizio della riga per contrassegnare un blocco come codice (piuttosto che usare backtick). Al momento non è chiaro se si stanno usando i backtick nel proprio codice o se si sta tentando di visualizzare il codice usando i backtick.
Dunxd,

La formattazione va bene. dobbiamo passare i lavori -p usando i backtick altrimenti non lo considererà un comando e genererà un errore.
lunedì

5

Nel caso in cui ciò aiuti qualcun altro, la maggior parte delle persone è qui perché ha interrotto alcuni processi che ha avviato, magari in background tramite la shell. Avevo bisogno di trovare i processi, come root, fermati da altri utenti, per i quali le varianti del jobscomando non lo fanno.

Un po 'di ricerche con man psme mi hanno portato a questo

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

Spiegazione: la -abandiera dice mostra tutti i processi, quindi -ocontrolla l'output, quali informazioni verranno mostrate su ogni processo. Ho scelto pid, user, cmd(riga di comando), e state, che è lo stato del processo .

Da 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

così finalmente lo installo a grep T$cui dice, mostrami tutti i processi che hanno T nell'ultima colonna.

E poi ho un bel elenco di tutti i processi di diversi utenti che si trovano nello stato di arresto.

$ 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

Per arrestare i lavori collegati alla shell corrente, jobs -psè più semplice di questa risposta. Detto questo, questa risposta non mostra solo i lavori arrestati tramite Ctrl-Zin una shell, ma tutti i lavori arrestati: altre shell, altri utenti , inclusi i lavori in fase di debug (ad esempio da gdb).
Stéphane Gourichon,

Per me la risposta migliore, ma non funziona esattamente. Ho dovuto usare ps -el | grep Tper trovare i processi nello stato 'T'.
dr0i,

4

Se si desidera rimuovere alcuni processi interrotti ma non tutti, provare questo:

Innanzitutto, elenca i lavori, otterrai qualcosa del genere:

$ jobs -l

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

invia kill a un lavoro interrotto, non farà altro che fare la coda che portarlo in primo piano, terminerà

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

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

4

Normalmente se ricevi quel messaggio, devi disconnetterti due volte. Ad esempio, per prima Ctrl+Dcosa viene visualizzato un messaggio di avviso che informa sui lavori interrotti, premendo per la seconda volta si disconnetterà uccidendo i lavori. Lo stesso vale per logoute exitcomandi.

Per ucciderli manualmente, provare: kill $(jobs -p).


Se non vuoi uccidere i lavori dalla tua shell corrente, puoi rimuoverli dalla tabella dei lavori attivi senza uccidere usando il disowncomando. Per esempio

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

I lavori interrotti possono anche essere determinati dallo stato del processo ( Tcarattere), il che significa che il processo è stato interrotto da un segnale come SIGSTOP, SIGTSTPo altro (come SIGTTIN, o SIGTTOU).

Nel caso in cui jobsun comando incorporato della shell non sia disponibile, i processi arrestati possono essere elencati con il comando seguente:

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

Per ucciderli tutti, puoi praticamente digitare:

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

Ecco un semplice 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.