【发布时间】:2014-02-28 00:02:04
【问题描述】:
我有一个 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
这里发生了什么?如何确保子进程与父进程一起死亡?
【问题讨论】:
标签: python linux bash process multiprocessing