Quando tento sair do meu servidor Linux, recebo a mensagem:
Há trabalhos interrompidos.
: Existe um único comando para matá-los?
shopt -s checkjobs
no meu .bashrc
Quando tento sair do meu servidor Linux, recebo a mensagem:
Há trabalhos interrompidos.
: Existe um único comando para matá-los?
shopt -s checkjobs
no meu .bashrc
Respostas:
Para eliminar rapidamente todos os trabalhos interrompidos no bash, digite:
kill -9 `jobs -ps`
jobs -ps
lista os IDs do processo ( -p
) dos -s
trabalhos interrompidos ( ).
kill -9 `jobs -ps`
envia sinais SIGKILL para todos eles.
sudo kill `jobs -p`
não funcionou, mas digitar explicitamente o PID funcionou.
kill
como esse não fará nada, já que os processos são interrompidos, eles não processarão o SIGTERM (-15) que é enviado a eles por padrão.
Tente digitar isso:
kill -9 $(jobs -p)
A resposta aceita mataria todos os trabalhos (o que é suficiente neste caso) e não apenas os interrompidos. Se você quiser matar apenas os Parados, execute:
kill $(jobs -l | grep Stopped | cut -d' ' -f3)
awk '/Stopped/{print $3}')
-s
argumento sobre os filtros de resposta aceita apenas as que pararam
A maneira mais fácil é realmente tentar imediatamente a saída imediatamente; bash
vai entender isso como "matar todos os trabalhos interrompidos e sair".
for x in `jobs -p` ; do kill -9 $x ; done
Caso isso ajude outra pessoa - a maioria das pessoas está aqui porque teve alguns processos interrompidos que eles iniciaram, em segundo plano através do shell talvez. Eu precisava encontrar processos, como root, interrompidos por outros usuários, para os quais as variantes do jobs
comando não funcionariam.
Um pouco de escavação man ps
me levou a isso:
ps -a -o pid,user,cmd,state | grep 'T$'
Explicação: o -a
sinalizador diz mostrar todos os processos e, em seguida, -o
controla a saída, que informações serão mostradas sobre cada processo. Eu estou escolhendo pid
, user
, cmd
(linha de comando), e state
, o 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, eu dirijo o grep T$
que diz, mostre-me todos os processos que têm T na última coluna.
E então eu tenho uma boa lista de todos os processos de diferentes usuários que estão no estado parado.
$ 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
é mais simples que esta resposta. Dito isto, esta resposta não mostra apenas os trabalhos interrompidos Ctrl-Z
no shell, mas todos os trabalhos interrompidos: outros shells, outros usuários , incluindo trabalhos sendo depurados (por exemplo, por gdb).
ps -el | grep T
para encontrar os processos no estado 'T'.
Se você deseja remover alguns trabalhos interrompidos, mas não todos, tente o seguinte:
Primeiro, listar trabalhos, você obterá algo como isto:
$ jobs -l
[2] 4813 Stopped ./parse < call.txt
[3]- 4819 Stopped ./parse < call.txt
enviar kill para um trabalho parado, ele não fará nada além de fila do que trazê-lo para o primeiro plano; ele terminará
$ fg %2
./parse < call.txt
Terminated
$ jobs -l
[3]- 4819 Stopped ./parse < call.txt
Normalmente, se você recebeu essa mensagem, precisa sair duas vezes. Por exemplo, primeiro, Ctrl+Dvocê recebe a mensagem de aviso para informá-lo sobre os trabalhos interrompidos, pressionando pela segunda vez, você será desconectado, eliminando os trabalhos. O mesmo se aplica aos comandos logout
e exit
.
Para matá-los manualmente, tente: kill $(jobs -p)
.
Se você não deseja matar tarefas do seu shell atual, é possível removê-las da tabela de tarefas ativas sem matar usando o disown
comando 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
caractere), o que significa que o processo foi interrompido por um sinal como SIGSTOP
, SIGTSTP
ou outro (como SIGTTIN
, ou SIGTTOU
).
Caso jobs
um comando incorporado do shell não esteja disponível, os processos interrompidos poderão ser listados pelo seguinte comando:
ps wuax | awk '$8 ~ "T"'
Para matar todos eles, você pode digitar basicamente:
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