Bash Script para encontrar processos zumbis?

1

Tão recentemente eu notei que eu tenho um processo que irá aleatoriamente travar e se tornar um zumbi com um PPID de 1 (init). Já me disseram que a única maneira de consertar isso é reinicializar o PC (ou enviar SIGCHLD para o init, que é .... arriscado / inútil, pelo que entendi.)

Essencialmente, o que eu quero fazer é escrever um script bash que irá apenas procurar por um processo zumbi e se houver um, reinicie o PC.

Atualmente, eu uso este script para monitorar o processo em si:

 ps auxw | grep ethminer | grep -v grep > /dev/null

 if [ $? != 0 ]
 then
    sudo reboot
 fi

Agora, este script parece funcionar bem quando o ethminer é RUNNING ou NOT RUNNING; ele reinicializará a máquina se ela não vir o ethminer na tabela de processos, e não fará nada se não a vir.

No entanto, (do meu conhecimento reconhecidamente solto), já que não há código de saída quando o processo se torna um zumbi if [ $? != 0 ] não recebe nenhuma entrada e, portanto, não faz nada.

Existe alguma maneira que eu possa consertar / modificar este script para que ele faça o que eu quero? Ou eu estou fora do caminho aqui?

Obrigado!

    
por cannabeatz 01.09.2016 / 20:24

1 resposta

4

Você não precisa reboot quando eles são processos zumbis. Aqui está o porquê:

  • Um processo se torna zumbi quando o processo é concluído, mas seu pai não chamou wait(2) para obter seu código de retorno

  • O zumbi não usa nenhum recurso físico ou virtual, exceto apenas uma entrada na tabela de processos do kernel

  • Uma vez que o pai chamar wait(2) , o zumbi será colhido corretamente e a entrada da tabela de processo será removida

  • Se o zumbi se tornar órfão, ou seja, se seu pai morrer, então init (PID 1) herdará o processo e o colherá chamando wait(2)

Como você pode ver, é uma questão de tempo até que o wait(2) seja chamado e o zumbi seja colhido. Se você tem muitos zumbis ao longo do tempo, considere que é uma falha de programação, você deve procurar consertar (ou pedir para consertar) o código em vez de reboot ing, o que é absolutamente desnecessário e não deve ser feito.

Para encontrar os processos zumbis, obtenha o STATE do processo, se for Z , o processo é um zumbi:

ps -eo pid,ppid,state,cmd | awk '=="Z"'

Aqui eu tomei apenas campos seletivos, ou seja, o PID, PPID, STATE e COMMAND.

    
por heemayl 01.09.2016 / 20:42