Remova um processo zumbi da tabela de processos

8

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.

skerit
fonte
7
... com uma espingarda. ;)
Nathan C
+1, porque eu olhei para o "zumbi matar" principal e serra
HopelessN00b

Respostas:

16

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 enviando SIGCHLDaos 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 SIGCHLDao pai quando morreu e se tornou um zumbi), portanto, o próximo passo é matar o pai.
Uma ferramenta como pstree(com a -popçã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 sempre wait()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 enviar SIGCHLDpara init, mas realmente não deveria fazer isso, e se isso não funcionar, seu único recurso é reiniciar porque o sistema initestá 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:

  1. Determinar os PIDS dos processos zumbi e pai
    (neste exemplo, digamos que o zumbi é PID 3101 e o pai é PID 3100)
  2. Acione gdbe attachpara o pai:
    attach 3100
  3. Chame waitpido zumbi:
    call waitpid(3101,0,0)
  4. Desconecte do pai ( detach) e saia do depurador.

(Este é um rifle sniper bem ajustado.)

voretaq7
fonte
1
heh, ótima resposta. "Mosin" rifle ali.
Danila Ladner
1
@DanilaLadner Eu gostaria de poder receber crédito, mas até que eu fiz uma pequena busca no Google para ver o que o skerit significava em "anexar o zumbi como filho de um processo fictício", o pensamento de usar o depurador para forçar um waitpid()nunca me ocorreu. Eu sou um terrível ex-programador ...
voretaq7
call waitpidnunca retorna para mim
deFreitas 16/10
0

Por 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).

vonbrand
fonte