当subprocess.call收到终止信号时会发生什么?

时间:2019-08-21 00:18:42

标签: python subprocess

信号会继续下降到被叫进程吗?

例如,我向正在等待SIGINT完成的python进程发出subprocess.callsubprocess.call被打断。子进程会怎样? SIGTERM等如何?

@zerkms指出,杀死父进程通常不会将终止信号传递给子进程。但是,使用python subprocess.call函数很容易检查是否发生了某些事情:

第1航站楼

$ python3
>>> import subprocess
>>> with open("foo.py", "w") as f:
...     f.write("import time; time.sleep(6000)")
... 
29
>>> subprocess.call(["python3", "foo.py"])

第2航站楼

$ ps aux | grep foo.py
scott 3716  ........  20:03   0:00 python3 foo.py
scott 3720  ........  20:03   0:00 grep --color=auto foo.py

第1航站楼

<Ctrl-C>
^CTraceback (most recent call last):
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/subprocess.py", line 289, in call
    return p.wait(timeout=timeout)
  File "/usr/lib/python3.6/subprocess.py", line 1477, in wait
    (pid, sts) = self._try_wait(0)
  File "/usr/lib/python3.6/subprocess.py", line 1424, in _try_wait
    (pid, sts) = os.waitpid(self.pid, wait_flags)
KeyboardInterrupt

第2航站楼

$ ps aux | grep foo.py

scott 3722  ........  20:04   0:00 grep --color=auto foo.py

在这种情况下,至少subprocess.call的论点似乎被杀死了。

1 个答案:

答案 0 :(得分:6)

链接的问题解决了不同的情况。信号被发送到进程(通过指定pid)。确实,这些孩子的小品得以生存。

在您的情况下,<Ctrl-C>本身不是信号;它指示终端驱动程序将SIGINT发送到关联进程组中的每个进程

取决于子进程的创建方式,它可以保留在父进程组中,也可以与其脱离。在后一种情况下,在父母的控制终端中键入的<Crtl-C>对孩子没有影响。显然,subprocess.call选择让孩子与原始控制终端保持联系,因此它确实收到了SIGINT

我不知道是否记录了这种行为。一般来说,这是有道理的。只有恶魔才有理由离婚。

PS:仅* nix。不知道它如何在Windows上工作。