import subprocess
f = subprocess.Popen(['python', 'a.py'])
time.sleep(3000)
a.py
import time
time.sleep(1000)
运行Python b.py,按CTRL + C,这两个过程将终止。
但是,将信号SIGINT发送到父进程b.py,kill -2 xxxx,但子进程a.py仍然存在。
import subprocess
f = subprocess.Popen(['python', 'a.py'])
time.sleep(3000)
a.py
import time
time.sleep(1000)
运行Python b.py,按CTRL + C,这两个过程将终止。
但是,将信号SIGINT发送到父进程b.py,kill -2 xxxx,但子进程a.py仍然存在。
Ctrl-C
在您的终端通常前台进程组在发送SIGINT
到所有进程。你的父母和你的孩子进程都在这个进程组中。
如需更详细的说明,请参见例如The TTY demystified或Process Groups and Sessions
更多的技术版本由Kirk McKusick如果你只是杀死父母的过程中,孩子是父母双亡的孤儿因而被重设父以PID 1(在里面)。你也可以在ps
的输出中看到。由于你的子过程从来没有收到信号,它只是继续运行。
是的,那正是我需要的。我不在乎一个孤儿过程,我的最初目的是保持它即使父过程死亡也能运行。然后ctrl + c的问题来打扰我。看起来我必须在前台过程中捕获这些信号。 – user3201982 2015-03-13 08:51:45
我想你想要的是*守护*孩子。实际上有一个PEP:https://www.python.org/dev/peps/pep-3143/ – dhke 2015-03-13 08:55:34
这个文件太复杂了,我不明白。我可以使用subprocess.Popen来运行一个新的进程吗?当然,将preexec_fn参数设置为os.setsid(),以便使子进程与父进程组分离。 – user3201982 2015-03-13 09:35:53
是什么让你认为CTRL-C作为一个SIGINT来处理? – 2015-03-13 07:59:07
错字。 SIGINT。无论如何,我正在谈论信号2 – user3201982 2015-03-13 08:01:38
同样的问题,是什么让你认为CTRL-C是一个简单的SIGINT?你在使用什么操作系统? – 2015-03-13 08:05:22