在python中,我有一个衍生的shell进程,我可能会手动停止,或者当它感觉像它时它可能会终止。我是否可以收到已完成的通知,而无需一直查询?
class Foo(object):
def __init__(self):
self.running = False
def start(self):
import os
from subprocess import Popen, PIPE
self.proc = Popen(['foo'], stdout=PIPE, shell=True, preexec_fn=os.setsid)
self.running = True
def stop(self):
if not self.running:
print 'already stopped'
else:
import os, signal
os.killpg(self.proc.pid, signal.SIGINT)
self.on_complete()
def on_complete(self):
self.running = False
构造或多或少与上述相似。我的问题是,如果进程正常终止,而不是由我自己的中断,那么self.running
仍然是True
所以我不能依赖该属性来获取类中的其他逻辑。
是否有一种简单的方法让on_complete
调用正常终止的情况,或者这首先是一个愚蠢的设计?
答案 0 :(得分:3)
您应该能够为SIGCHLD
安装处理程序。但是,请仔细阅读文档;通过注册对该信号的兴趣,您承诺在信号处理程序中处理子进程;子进程本身wait
上的任何内容都将阻塞,直到所有正在运行的子进程都被信号处理程序处理,然后出错。这包括system()
和Popen
自己的子进程清理。 (例如,请参阅Popen.communicate() throws OSError: "[Errno 10] No child processes"。)