Zombies en bash

11

Bash ne semble pas créer de zombies. Il semble que les processus soient immédiatement récoltés lorsqu'ils sont tués.

Puis-je faire bash faire des zombies?


Pourquoi je demande:

J'aimerais pouvoir tuer un processus enfant en toute sécurité ou en toute sécurité kill -9s'il ne meurt pas dans un certain laps de temps, mais je ne veux pas zapper accidentellement un processus qui n'est pas mon processus enfant. Les processus Zombie le rendent généralement très facile et sûr pour les conditions de course.

PSkocik
la source
1
Peut-être une autre idée ... si vous voulez vraiment vous protéger contre la destruction des processus externes, consultez les groupes de contrôle. Appelez unsharepour créer un espace de noms PID, de sorte que de l'intérieur de cette arborescence de processus, les processus externes soient isolés et inaccessibles.
orion
Utilisez le contrôle des travaux (comme dans, kill -KILL %nnest le numéro du travail, etc.), au lieu d'essayer de le contourner.
Nominal Animal
Grande question! Une autre approche de «pourquoi vous demandez», cependant: avez-vous envisagé la timeoutcommande?
Wildcard

Réponses:

13

Pour créer un processus zombie:

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

Cela remplace le shell qui s'exécute sleep 1avec /bin/sleep 10qui ne saura pas que le sleep 1processus s'est terminé, créant ainsi un zombie pendant 10 secondes.


Je ne sais pas ce que vous attendez de tuer un processus zombie. Un processus zombie était déjà mort, vous ne pouvez pas le tuer.

En fait, vous pouvez faire disparaître les processus zombies, mais en tuant son parent, pas les processus zombies eux-mêmes.

cuonglm
la source
Les PID récoltés sont recyclés. Le point des zombies est qu'ils réservent des PID jusqu'à ce que le parent reconnaisse la mort de son enfant en l'attendant. Sans cela, tuer un pid peut entraîner une victime accidentelle.
PSkocik
1
En C, vous pouvez être sûr que vous ne ferez pas une victime accidentelle lorsque vous tuez votre enfant parce que tant que vous n'avez pas attendu cet enfant, le PID de cet enfant ne peut pas être recyclé. J'aimerais pouvoir avoir la même garantie dans la coque.
PSkocik
3

Réponse pas si intéressante:

$ (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
la source
Comment est-ce un processus zombie? Ça vient de s'arrêter. Aussi $BASHPIDest $$je pense.
Gabor Csardi
$BASHPID ce n'est pas pareil $$. Essayez de suivre le code: echo $$ $BASHPID ;echo $(echo $$ $BASHPID). Vous pouvez trouver plus d'informations dans man bash.
Alex Baranowski