subprocess Popen:信号不传播

时间:2016-09-20 21:47:04

标签: python subprocess signals

execute_sleep.py

import os
import time
import subprocess

sleep_script = 'sleep_forever.py'
child = subprocess.Popen(sleep_script,
                         shell=True,
                         close_fds=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT,
                        )

subout = child.communicate()[0]
print subout
rc = child.returncode

sleep_forever.py

#!/usr/bin/python
import time

while True:
    time.sleep(1)

当我运行execute_sleep.py然后kill -TERM -- -<pid of execute_sleep.py>时, execute_sleep.py死了,但sleep_forever.py一直在运行。

我能做什么,以便当execute_sleep.py获得信号时,它会传播到sleep_forever.py?

这些选项中的任何一个都会阻止信号吗?

  • shell=True
  • close_fds=True
  • 使用subprocess.PIPE

1 个答案:

答案 0 :(得分:1)

您需要处理信号,否则您正在创建孤儿(sleep_script进程)。因此,当捕获终止父进程的信号时,它会传播到子进程之前。

def handler(signum, frame):
    functionToKillSleeper(pidtokill)


signal.signal(signal.SIGTERM, handler)

请注意,无法捕获SIGKILL。

因此,您需要SIGINT或SIGTERM父进程才能处理信号,否则您的问题仍将存在。