(在Ubuntu 16.04上使用python3.4)
我试图了解我的行为是否是功能或其他原因。
我正在启动一个ipython shell,并正在启动一个进程-
subprocess.Popen("MyProcess")
在那之后,我拖了一个文件-
! tail -f a_log
然后,我按Control + c退出尾巴。
结果是MyProcess也停止了。
当有多个正在运行的进程=它们都被杀死时,我看到了这一点。
还尝试将stdout和stderr重定向到subprocess.DEVNULL,但这没有帮助。
答案 0 :(得分:0)
我相信这是CTRL C所做的
答案 1 :(得分:0)
您需要了解的第一件事是ctrl + c会将signal发送到前任任务的进程组。您需要知道的第二件事是进程组包括您的Python进程及其开放的子进程。
例如,我将使用4行脚本在没有iPython的情况下重新创建您的实验:
import subprocess, os
pipe1 = subprocess.Popen('sleep 500', shell=True)
pipe2 = subprocess.Popen('sleep 500', shell=True)
pipe3 = subprocess.Popen('tail -f /var/log/syslog', shell=True).wait()
如您所见,这将打开两个通往sleep
的管道(在500秒内不执行任何操作)和一个通往tail
的管道,并跟随/var/log/syslog
。
现在,在运行的同时,我要在另一个终端中输入ps ax -O tpgid
,并查看我正在运行的进程,包括其组ID :
24083 24083 S pts/9 00:00:00 python3 foo.py
24084 24083 S pts/9 00:00:00 /bin/sh -c sleep 500
24085 24083 S pts/9 00:00:00 sleep 500
24086 24083 S pts/9 00:00:00 /bin/sh -c sleep 500
24087 24083 S pts/9 00:00:00 sleep 500
24088 24083 S pts/9 00:00:00 /bin/sh -c tail -f /var/log/syslog
24089 24083 S pts/9 00:00:00 tail -f /var/log/syslog
第一列是进程ID,第二列是组ID,这很重要。
如果我运行kill -INT 24083
,它将INT
(中断)信号发送到24083 进程组,则该组中的所有进程都会接收到该信号并相应地退出。 / p>
当您按ctrl + c时,这就是您正在发生的事情。进程组接收到信号,并且每个进程都将按照POSIX标准退出。
答案 2 :(得分:0)
我找到了一种方法:
import os
def myspawn():
os.setsid()
path = os.environ["PATH"] + ":/home/another/path"
env = {"PATH": path}
os.execlpe("program.sh", env)
def myFunc():
pid = os.fork()
if (pid == 0):
print("In child")
myspawn()
else:
print("in father")
return
myFunc()