Zombies in Bash

10

Bash scheint keine Zombies zu erschaffen. Es sieht so aus, als würden die Prozesse sofort geerntet, wenn sie getötet werden.

Kann ich Bash zu Zombies machen?


Warum ich frage:

Ich möchte in der Lage sein, einen untergeordneten Prozess sicher zu beenden oder ihn sicher zu beenden kill -9, wenn er nicht innerhalb eines bestimmten Zeitraums stirbt, aber ich möchte nicht versehentlich einen Prozess zappen, der nicht mein untergeordneter Prozess ist. Zombie-Prozesse machen es normalerweise sehr einfach und rennsicher.

PSkocik
quelle
1
Vielleicht eine andere Idee ... Wenn Sie wirklich vor dem Töten externer Prozesse schützen möchten, schauen Sie sich cgroups an. Rufen Sie unshareauf, um einen PID-Namespace zu erstellen, damit innerhalb dieses Prozessbaums die externen Prozesse isoliert und nicht zugänglich sind.
Orion
Verwenden Sie die Jobsteuerung (wie in, kill -KILL %nwo nist die Jobnummer usw.), anstatt zu versuchen, sie zu umgehen.
Nominelles Tier
Gute Frage! Ein alternativer Ansatz zu "Warum fragst du timeout? ": Haben Sie den Befehl in Betracht gezogen ?
Wildcard

Antworten:

13

So erstellen Sie einen Zombie-Prozess:

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

Dadurch wird die Shell ersetzt, sleep 1mit der /bin/sleep 10der sleep 1Prozess nicht beendet wird. Daher wird 10 Sekunden lang ein Zombie erstellt.


Ich bin mir nicht sicher, was Sie von einem Zombie-Prozess erwarten. Ein Zombie-Prozess war bereits tot, man kann ihn nicht töten.

Eigentlich können Sie Zombie-Prozesse verschwinden lassen, aber indem Sie die Eltern töten, nicht die Zombie-Prozesse selbst.

cuonglm
quelle
Geerntete PIDs werden recycelt. Der Punkt von Zombies ist, dass sie PIDs reservieren, bis der Elternteil den Tod seines Kindes anerkennt, indem er darauf wartet. Ohne dies kann das Töten einer PID zu einem versehentlichen Opfer führen.
PSkocik
1
In C können Sie sicher sein, dass Sie kein versehentliches Opfer werden, wenn Sie Ihr Kind töten, denn bis Sie auf dieses Kind gewartet haben, kann die PID dieses Kindes nicht recycelt werden. Ich möchte die gleiche Garantie in der Shell haben können.
PSkocik
3

Nicht so interessante Antwort:

$ (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
quelle
Wie ist das ein Zombie-Prozess? Es hörte einfach auf. Auch $BASHPIDist , $$denke ich.
Gabor Csardi
$BASHPID ist nicht dasselbe $$. Versuchen Sie folgenden Code : echo $$ $BASHPID ;echo $(echo $$ $BASHPID). Weitere Informationen finden Sie in man bash.
Alex Baranowski