python kill子进程在退出时通信

python kill子进程在退出时通信,python,subprocess,global,kill,Python,Subprocess,Global,Kill,我有一个很大的脚本,用来运行一个任务,一次一个。但是我有一个init脚本,它使用start-stop守护进程在我们想要的任何时候杀死这个脚本。脚本结束得很好,但subprocess命令一直运行到完成。我怀疑这可能只是我如何处理全局变量的问题。或者我正在使用的。与子流程通信。总之,以下是代码中的相关内容: import subprocess import os import signal pro = '' def sigHandler( signum, frame ): global

我有一个很大的脚本,用来运行一个任务,一次一个。但是我有一个init脚本,它使用start-stop守护进程在我们想要的任何时候杀死这个脚本。脚本结束得很好,但subprocess命令一直运行到完成。我怀疑这可能只是我如何处理全局变量的问题。或者我正在使用的。与子流程通信。总之,以下是代码中的相关内容:

import subprocess
import os
import signal

pro = ''

def sigHandler( signum, frame ):
    global pro
    os.killpg( pro.pid, signal.SIGTERM )
    sys.exit()

def run(data):
    #I found an example using preexec_fn somewhere on stackoverflow. Cant
    #remember if they were using .communicate() or not
    global pro
    pro = subprocess.Popen( command, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False, preexec_fn = os.setsid ).communicate()
    return( 1 )

if __name__ == '__main__':
    signal.signal( signal.SIGTERM, sigHandler )
    while True:
        run( relevantData )

我的朋友帮我弄明白了。正如我在评论中所说,在命令运行时,pro没有被填充。因此,我必须将代码更改为:

pro = subprocess.Popen( command, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False, preexec_fn = os.setsid )
pro.communicate()

然后它就开始工作了:)

看起来变量pro在子流程完成之前不会获得数据。因此,当sigterm在子流程运行时运行时,没有pid数据要终止。这可能是communicate()的一个功能。我想改用wait(),但命令的输出遇到了缓冲区问题。