Имам скрипт на Python: zombie.py
from multiprocessing import Process
from time import sleep
import atexit
def foo():
while True:
sleep(10)
@atexit.register
def stop_foo():
p.terminate()
p.join()
if __name__ == '__main__':
p = Process(target=foo)
p.start()
while True:
sleep(10)
Когато стартирам това с python zombie.py &
и убия родителския процес с kill -2
, stop()
се извиква правилно и двата процеса се прекратяват.
Сега да предположим, че имам bash скрипт zombie.sh:
#!/bin/sh
python zombie.py &
echo "done"
И стартирам ./zombie.sh
от командния ред.
Сега stop()
никога не се обажда, когато родителят бъде убит. Ако стартирам kill -2
на родителския процес, нищо не се случва. kill -15
или kill -9
и двете просто убиват родителския процес, но не и дъщерния:
[foo@bar ~]$ ./zombie.sh
done
[foo@bar ~]$ ps -ef | grep zombie | grep -v grep
foo 27220 1 0 17:57 pts/3 00:00:00 python zombie.py
foo 27221 27220 0 17:57 pts/3 00:00:00 python zombie.py
[foo@bar ~]$ kill -2 27220
[foo@bar ~]$ ps -ef | grep zombie | grep -v grep
foo 27220 1 0 17:57 pts/3 00:00:00 python zombie.py
foo 27221 27220 0 17:57 pts/3 00:00:00 python zombie.py
[foo@bar ~]$ kill 27220
[foo@bar ~]$ ps -ef | grep zombie | grep -v grep
foo 27221 1 0 17:57 pts/3 00:00:00 python zombie.py
какво става тук Как мога да се уверя, че дъщерният процес умира заедно с родителя?