当Popen终止时,我怎么能收到信号?

时间:2011-07-11 01:29:44

标签: python shell signals popen terminate

在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调用正常终止的情况,或者这首先是一个愚蠢的设计?

1 个答案:

答案 0 :(得分:3)

您应该能够为SIGCHLD安装处理程序。但是,请仔细阅读文档;通过注册对该信号的兴趣,您承诺在信号处理程序中处理子进程;子进程本身wait上的任何内容都将阻塞,直到所有正在运行的子进程都被信号处理程序处理,然后出错。这包括system()Popen自己的子进程清理。 (例如,请参阅Popen.communicate() throws OSError: "[Errno 10] No child processes"。)