Como posso matar todos os trabalhos interrompidos?

82

Quando tento sair do meu servidor Linux, recebo a mensagem:

Existem trabalhos interrompidos.

: Existe um único comando para matar estes?

    
por Zubair 25.02.2011 / 11:07

8 respostas

69

Para eliminar rapidamente todos os trabalhos em execução no bash, digite:

kill 'jobs -ps'

jobs -ps list ID do processo dos trabalhos interrompidos. kill 'jobs -ps' envia o sinal TERM para todos os trabalhos interrompidos.

    
por 25.02.2011 / 11:15
77

Tente digitar isso:

kill -9 $(jobs -p)
    
por 25.02.2011 / 11:14
16

A resposta aceita mataria todos os trabalhos (o que é suficiente neste caso) e não apenas os interrompidos. Se você quiser matar apenas os Stopped, execute:

kill $(jobs -l | grep Stopped | cut -d' ' -f3)
    
por 08.03.2011 / 19:04
12

A maneira mais fácil é simplesmente repetir imediatamente a saída; bash considerará isso "matar todos os trabalhos parados e sair".

    
por 08.03.2011 / 19:13
7
for x in 'jobs -p' ; do kill -9 $x ; done
    
por 26.02.2013 / 11:22
4

Se você quiser remover alguns trabalhos interrompidos, mas não todos, tente o seguinte:

Primeiro, listar trabalhos, você terá algo assim:

$ jobs -l

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

manda matar para um trabalho parado, não fará nada além de fazer fila que trazê-lo em primeiro plano, terminará

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

$ jobs -l
[3]-  4819 Stopped                 ./parse < call.txt
    
por 30.05.2014 / 06:16
4

Normalmente, se você recebeu essa mensagem, precisa fazer o logout duas vezes. Por exemplo. O primeiro Ctrl + D dá-lhe a mensagem de aviso para informá-lo sobre os trabalhos parados, pressionando pela segunda vez você sairá matando os trabalhos. O mesmo se aplica aos comandos logout e exit .

Para eliminá-los manualmente, tente: kill $(jobs -p) .

Se você não quiser eliminar tarefas do seu shell atual, poderá removê-las da tabela de tarefas ativas sem eliminá-las usando o comando disown . Por exemplo,

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

Os trabalhos interrompidos também podem ser determinados pelo estado do processo ( T character), o que significa que o processo foi interrompido por sinal como SIGSTOP , SIGTSTP ou outro (como SIGTTIN ou SIGTTOU ).

Caso o comando jobs a builtin do shell não esteja disponível, os processos parados podem ser listados pelo seguinte comando:

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

Para matar todos eles, você basicamente pode digitar:

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

Aqui está um teste simples:

$ 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
    
por 19.02.2016 / 21:46
4

Apenas no caso de isso ajudar alguém - a maioria das pessoas está aqui porque eles têm alguns processos interrompidos que eles iniciaram, talvez por meio do shell. Eu precisava encontrar processos, como root, interrompidos por outros usuários, para os quais as variantes no comando jobs não funcionariam.

Um pouco de pesquisa com man ps me levou a isso:

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

Explicação: o -a sinalizador mostra todos os processos e, em seguida, -o controla a saída, que informações serão mostradas sobre cada processo. Estou escolhendo pid , user , cmd (a linha de comando) e state , que é o estado do processo .

De 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

então finalmente canalizo para grep T$ que diz, mostre todos os processos que possuem T na última coluna.

Depois, tenho uma boa lista de todos os processos de diferentes usuários que estão no estado interrompido.

$ 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
    
por 26.02.2016 / 07:47