Quando provo ad uscire dal mio server Linux ricevo il messaggio:
Ci sono lavori interrotti.
: C'è un solo comando per ucciderli?
shopt -s checkjobs
mio .bashrc
Quando provo ad uscire dal mio server Linux ricevo il messaggio:
Ci sono lavori interrotti.
: C'è un solo comando per ucciderli?
shopt -s checkjobs
mio .bashrc
Risposte:
Per terminare rapidamente tutti i lavori interrotti sotto la bash, immettere:
kill -9 `jobs -ps`
jobs -ps
elenca gli ID processo ( -p
) dei -s
lavori arrestati ( ).
kill -9 `jobs -ps`
invia segnali SIGKILL a tutti loro.
sudo kill `jobs -p`
funzionato ma digitando esplicitamente PID ha fatto.
kill
tale non farà nulla, poiché i processi vengono arrestati, non elaboreranno il SIGTERM (-15) che viene inviato loro per impostazione predefinita.
Prova a digitare questo:
kill -9 $(jobs -p)
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)
awk '/Stopped/{print $3}')
-s
argomento sulla risposta accettata filtra solo quelli bloccati
Il modo più semplice è in realtà semplicemente ritentare immediatamente l'uscita; bash
ciò significherà "uccidere tutti i lavori interrotti ed uscire".
for x in `jobs -p` ; do kill -9 $x ; done
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 jobs
comando non lo fanno.
Un po 'di ricerche con man ps
me mi hanno portato a questo
ps -a -o pid,user,cmd,state | grep 'T$'
Spiegazione: la -a
bandiera dice mostra tutti i processi, quindi -o
controlla 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
jobs -ps
è più semplice di questa risposta. Detto questo, questa risposta non mostra solo i lavori arrestati tramite Ctrl-Z
in una shell, ma tutti i lavori arrestati: altre shell, altri utenti , inclusi i lavori in fase di debug (ad esempio da gdb).
ps -el | grep T
per trovare i processi nello stato 'T'.
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
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 logout
e exit
comandi.
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 disown
comando. Per esempio
$ sleep 1000 &
[1] 19404
$ jobs
[1]+ Running sleep 1000 &
$ disown
I lavori interrotti possono anche essere determinati dallo stato del processo ( T
carattere), il che significa che il processo è stato interrotto da un segnale come SIGSTOP
, SIGTSTP
o altro (come SIGTTIN
, o SIGTTOU
).
Nel caso in cui jobs
un 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