Acabei de notar alguns processos zumbis no CentOS 6.8 (Final), tentei matá-los, mas eles ainda estão lá:
[root@host user]# ps -ef | grep git
tomcat 746 1 0 Jul18 ? 00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat 747 746 0 Jul18 ? 00:00:00 [git-remote-http] <defunct>
root 20776 20669 0 09:03 pts/3 00:00:00 grep git
tomcat 29970 1 0 Jul18 ? 00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat 29971 29970 0 Jul18 ? 00:00:00 [git-remote-http] <defunct>
[root@host user]# kill 746 747 29970 29971
[root@host user]# ps -ef | grep git
tomcat 746 1 0 Jul18 ? 00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat 747 746 0 Jul18 ? 00:00:00 [git-remote-http] <defunct>
root 21525 20669 0 09:26 pts/3 00:00:00 grep git
tomcat 29970 1 0 Jul18 ? 00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat 29971 29970 0 Jul18 ? 00:00:00 [git-remote-http] <defunct>
Como você pode ver, eles estão funcionando por dois meses, e também, se não forem prejudiciais, eu me livraria deles, alguma maneira alternativa de matar um zumbi?
kill -9
?747
e29971
são processos zumbis. Os outros podem estar trancados, mas ainda não estão mortos.Respostas:
Como mencionado por Heemayl, você não pode realmente matar um zumbi. Já está [des] morto ...
No entanto, o problema que você está enfrentando parece um problema com o
git clone
comando. Fica preso de alguma forma. Provavelmente atinge o tempo limite ou falha de alguma outra maneira? Geralmente, devido a algumas E / S, um processo fica preso ao ponto em que aSIGTERM
eSIGINT
não funciona.Para matá-lo, nesse caso, você deseja usar a
-9
opção de linha de comando. Isso significa enviar oSIGKILL
sinal. Você pode realmente usar-KILL
também.Para obter uma lista dos sinais disponíveis, use a opção de linha de comando list.
Isso mostra os números e nomes (e você verá que o nº 9 diz SIGKILL.)
fonte
kill -KILL
foi o único comando capaz de fechar esses processos, por esse motivo, vou aceitar a resposta do @Alexis Wilke. Mas certamente gostaria de expressar minha gratidão à resposta rápida, sábia e muito informativa @heemayl +1. Obrigado a todosVocê não pode matar um zumbi (processo), ele já está morto. Ele está apenas aguardando o processo pai executar
wait(2)
e coletar seu status de saída. Não será necessário nenhum recurso no sistema além de uma entrada da tabela de processos.Você pode enviar
SIGCHLD
ao pai ou mãe para que ele saiba que um de seus filhos terminou (ou seja, solicite que ele colete o status de saída do filho). Este sinal pode ser ignorado (que é o padrão):(Substitua
<PPID>
pelo PID real do pai.)Ou você pode matar o processo pai para que
init
(PID 1) herde o processo zumbi e o colha corretamente (é uma dasinit
principais tarefas de herdar qualquer órfão e fazê-lowait(2)
regularmente). Mas matar os pais não é recomendado. Geralmente, a criação de processos zumbis indica problemas de programação, e você deve tentar consertar ou reportar isso.fonte
SIGCHLD
, nenhum zumbi seria criado. Portanto, se não está ignorandoSIGCHLD
e os zumbis não estão sendo colhidos, o processo é de buggy ou não se importa com crianças zumbis. Dado que o processo em questão égit clone ...
, aposto que ele simplesmente não se importa com crianças zumbis, já que é um processo de vida curta (espero) que faz seu trabalho e depois sai.SIG_DFL
)SIGCHILD
também é ignorá-la, mas nesse caso os zumbis certamente não são colhidos automaticamente.SIG_DFL
) paraSIGCHILD
também é ignorá-la, mas neste caso os zumbis certamente não são colhidos automaticamente. Não sei ao que você está se referindo. Você está se referindo aos processos que não estão sendo colhidos na pergunta? Não estou vendo como o envioSIGCHLD
para um processo cujoSIGCHLD
manipulador está definido comoSIG_IGN
(explicitamente ou por padrão) fará com que esse processo colha zumbis.SIGCHLD
pode funcionar desta vez . A última vez que ele perdeu o sinal ou duas crianças morreram ao mesmo tempo e o código não é inteligente o suficiente para lidar com as duas mortes simultaneamente.procurar processos zumbis:
para matar o processo zumbi, os IDs pai precisam ser mortos, ou seja, PPID:
fonte
Quando um processo pai morre, todo o processo zumbi é limpo. Não mate o processo pai apenas para limpar o processo zumbi. Ele voltará quando você executar novamente o seu programa. Corrija seu programa chamando corretamente a chamada de sistema "wait ()" ou "waitpid ()".
fonte