Remove um processo zumbi da tabela de processos

6

Eu tenho um processo zumbi chato que é adotado pelo init, e não vai embora. Eu li que há uma maneira de criar um processo fictício, anexar o zumbi como um filho desse novo processo e então matá-lo, removendo-o da tabela de processos.

Como eu faria isso precisamente?

E sim, eu li a maioria dessas coisas:

Um processo de zumbis já está morto, então não pode ser morto.

Ou

Você deve apenas reiniciar o seu sistema

e

Processos de zumbis não usam recursos, você deve deixá-los

Infelizmente, muitos programas verificam a tabela de processos para ver se uma instância já está em execução e se recusarão a iniciar uma nova se houver uma entrada na tabela de processos.

E reinicializar toda vez que minha conexão SSHFS cai, levando o Sublime consigo, é meio bobo.

    
por skerit 12.02.2014 / 22:09

2 respostas

15

A maneira somente de se livrar de um zumbi é tornar seu pai wait() para que ele possa relatar seu status de saída. Você pode fazer isso enviando SIGCHLD para o pai, assumindo que o pai está escrito corretamente.

Se você tem zumbis, normalmente significa que o pai é NÃO escrito corretamente (porque a criança já enviou SIGCHLD para seu pai quando ele morreu e se tornou um zumbi) , então o próximo passo é matar os pais.
Uma ferramenta como pstree (com a opção -p ) pode mostrar a linhagem de seus zumbis para que você saiba qual processo é o pai.
Quando o pai morre, o zumbi é adotado por init , que é sempre wait() ing para crianças morrerem, e vai matar todos os zumbis que adotar.

Se o processo pai for realmente init (PID 1), você já está em uma situação que nunca deveria acontecer. Você pode tentar enviar SIGCHLD para init , mas você realmente não deveria ter que fazer isso, e se isso não funcionar, seu único recurso é reinicializar porque o init do seu sistema está quebrado e não está fazendo seu trabalho.

(Estas são as opções de "espingarda").

Algumas pessoas mais criativas do que eu também vieram com esta opção se você quiser evitar a morte do processo pai:

  1. Determine o zumbi & processos PIDS 'PIDS
    (Para este exemplo, digamos que o zumbi é o PID 3101 e o pai é o PID 3100)
  2. Acione gdb e attach para o pai:
    attach 3100
  3. Chame waitpid para o zumbi:
    call waitpid(3101,0,0)
  4. Desanexe do pai ( detach ) e saia do depurador.

(Este é um rifle sniper bem ajustado.)

    
por 12.02.2014 / 22:26
0

Por que você está preocupado com os processos zumbis? Os recursos que eles mantêm amarrados são mínimos (espaço para uma tarefa struct struct, um PID e não muito mais). Claro, isso é impróprio, mas é isso. Procure por seus pais e corrija-os, substitua-os por alternativas melhor escritas (pode ter outros efeitos colaterais benéficos), relate isso como bugs (o que eles certamente são).

    
por 13.02.2014 / 23:23