Eu tenho um processo zumbi irritante que é adotado pelo init, e ele não desaparece. Eu li que há uma maneira de criar um processo fictício, anexar o zumbi como filho desse novo processo e depois matá-lo, removendo-o da tabela de processos.
Como eu faria isso, precisamente?
E sim, eu li a maioria dessas coisas:
Um processo de zumbi já está morto, então não pode ser morto.
Ou
Você deve apenas reiniciar seu sistema
E
Os processos zumbis não usam recursos, você deve apenas deixá-los
Infelizmente, muitos programas verificam a tabela de processos para ver se uma instância já está em execução e se recusam a iniciar uma nova, se houver uma entrada na tabela de processos.
E reiniciar toda vez que minha conexão SSHFS cair, levando o Sublime com ela, é meio bobo.
Respostas:
A única maneira de se livrar de um zumbi é criar seu pai
wait()
para que ele possa relatar seu status de saída. Você pode fazer isso enviandoSIGCHLD
aos pais, assumindo que os pais foram gravados corretamente.Se você tem zumbis, geralmente significa que o pai NÃO foi gravado corretamente (porque a criança já foi enviada
SIGCHLD
ao pai quando morreu e se tornou um zumbi), portanto, o próximo passo é matar o pai.Uma ferramenta como
pstree
(com a-p
opção) pode mostrar a linhagem de seus zumbis para que você saiba qual processo é o pai.Quando os pais morrem, o zumbi é adotado
init
, o que semprewait()
permite que as crianças morram, e matará alegremente todos os zumbis que ele adotar.Se o processo pai já estiver
init
(PID 1), você estará em uma situação que nunca deve acontecer. Você pode tentar enviarSIGCHLD
parainit
, mas realmente não deveria fazer isso, e se isso não funcionar, seu único recurso é reiniciar porque o sistemainit
está quebrado e não está funcionando.(Essas são as opções de "espingarda").
Algumas pessoas mais criativas do que eu também criaram essa opção se você deseja evitar o processo pai:
(neste exemplo, digamos que o zumbi é PID 3101 e o pai é PID 3100)
gdb
eattach
para o pai:attach 3100
waitpid
o zumbi:call waitpid(3101,0,0)
detach
) e saia do depurador.(Este é um rifle sniper bem ajustado.)
fonte
waitpid()
nunca me ocorreu. Eu sou um terrível ex-programador ...call waitpid
nunca retorna para mimPor que você está preocupado com os processos zumbis? Os recursos que eles mantêm ligados são mínimos (espaço para uma tarefa de estrutura do esqueleto, um PID e não muito mais). Claro, é indecoroso, mas é isso. Procure seus pais e conserte-os, substitua-os por alternativas melhor escritas (podem ter outros efeitos colaterais benéficos), relate isso como bugs (o que certamente são).
fonte