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.