Zombis en bash

11

Bash no parece crear zombies. Parece que los procesos se cosechan de inmediato cuando los matan.

¿Puedo hacer bash hacer zombies?


Por qué estoy preguntando:

Me gustaría poder matar de manera segura un proceso secundario o de forma segura kill -9si no muere dentro de un cierto período de tiempo, pero no quiero eliminar accidentalmente un proceso que no es mi proceso secundario. Los procesos de zombis generalmente lo hacen muy fácil y seguro para las condiciones de carrera.

PSkocik
fuente
1
Quizás otra idea ... si realmente desea protegerse de matar procesos externos, consulte cgroups. Llame unsharepara crear un espacio de nombres PID, de modo que desde dentro de ese árbol de procesos, los procesos externos estén aislados e inaccesibles.
orion
Use el control de trabajo (como en, kill -KILL %ndónde nestá el número de trabajo, etc.), en lugar de tratar de eludirlo.
Nominal Animal
Gran pregunta! Sin embargo, un enfoque alternativo para "por qué preguntas": ¿has considerado el timeoutcomando?
Comodín

Respuestas:

13

Para hacer un proceso zombie:

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

Esto reemplaza el shell que se ejecuta sleep 1con /bin/sleep 10eso no sabrá que el sleep 1proceso terminó, por lo que creará un zombie durante 10 segundos.


No estoy seguro de qué esperas de matar un proceso zombie. Un proceso zombie ya estaba muerto, no puedes matarlo.

En realidad, puedes hacer que desaparezcan los procesos zombies, pero matando a su padre, no los procesos zombies mismos.

Cuonglm
fuente
Los PID cosechados se reciclan. El objetivo de los zombies es que reservan PID hasta que el padre reconozca la muerte de su hijo esperándolo. Sin esto, matar a un pid puede resultar en una víctima accidental.
PSkocik
1
En C, puede estar seguro de que no será una víctima accidental cuando mate a su hijo porque hasta que haya atendido a ese niño, el PID de ese niño no se puede reciclar. Me gustaría poder tener la misma garantía en el shell.
PSkocik
3

Respuesta no tan interesante:

$ (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
fuente
¿Cómo es esto un proceso zombie? Simplemente se detuvo. También $BASHPIDes $$, creo.
Gabor Csardi
$BASHPIDNo es lo mismo que $$. Trate siguiente código: echo $$ $BASHPID ;echo $(echo $$ $BASHPID). Puedes encontrar más información en man bash.
Alex Baranowski