Zumbis na festança

11

Bash não parece criar zumbis. Parece que os processos são colhidos imediatamente quando são mortos.

Posso fazer bash fazer zumbis?


Por que estou perguntando:

Eu gostaria de poder matar com segurança um processo filho ou com segurança kill -9, se ele não morrer dentro de um certo período de tempo, mas não quero zapear acidentalmente um processo que não seja o meu processo filho. Os processos zumbis geralmente tornam muito fácil e seguro para as condições de corrida.

PSkocik
fonte
1
Talvez outra idéia ... se você realmente deseja se proteger contra processos externos, consulte os cgroups. Chame unsharepara criar um espaço de nome PID, para que, dentro dessa árvore de processos, os processos externos sejam isolados e inacessíveis.
orion
Use o controle do trabalho (como em, kill -KILL %nonde nestá o número do trabalho etc.), em vez de tentar contorná-lo.
Animal Nominal
Ótima pergunta! Porém, uma abordagem alternativa para "por que você está perguntando": você considerou o timeoutcomando?
Curinga

Respostas:

13

Para fazer um processo zumbi:

$ (sleep 1 & exec /bin/sleep 10)

Isso substitui o shell que é executado sleep 1com o /bin/sleep 10qual o sleep 1processo não será concluído, criando um zumbi por 10 segundos.


Não sei o que você espera de matar um processo de zumbi. Um processo de zumbi já estava morto, você não pode matá-lo.

Na verdade, você pode fazer com que os processos zumbis desapareçam, mas matando seu pai, e não os processos zumbis.

cuonglm
fonte
Os PIDs colhidos são reciclados. O objetivo dos zumbis é que eles reservem PIDs até que os pais reconheçam a morte de seu filho esperando por ele. Sem isso, matar um pid pode resultar em uma vítima acidental.
PSKocik
1
Em C, você pode ter certeza de que não será uma vítima acidental quando matar seu filho, porque até que você espere por ele, o ID da criança não poderá ser reciclado. Eu gostaria de poder ter a mesma garantia no shell.
PSKocik
3

Resposta não tão interessante:

$ (A=$BASHPID && ( kill -STOP $A ))

[1]+  Stopped                 ( A=$BASHPID && ( kill -STOP $A ) )

$ ps -C bash
  PID TTY          TIME CMD
29453 pts/0    00:00:00 bash
29593 pts/0    00:00:00 bash
29594 pts/0    00:00:00 bash <defunct>
yaegashi
fonte
Como isso é um processo de zumbi? Apenas parou. Também $BASHPIDé $$eu acho.
Gabor Csardi 5/07
$BASHPIDnão é o mesmo que $$. Tente seguinte código: echo $$ $BASHPID ;echo $(echo $$ $BASHPID). Você pode encontrar mais informações em man bash.
Alex Baranowski