как я могу получить сигнал, когда Popen завершается?

в python у меня есть порожденный процесс оболочки, который я могу остановить вручную, или он может завершиться сам, когда захочет. могу ли я получить уведомление о том, что оно завершено, не опрашивая его все время?

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 в случае нормального завершения, или это вообще глупый дизайн?


person wim    schedule 11.07.2011    source источник


Ответы (1)


Вы сможете установить обработчик для SIGCHLD. Однако внимательно прочитайте документацию; регистрируя интерес к этому сигналу, вы обязуетесь обрабатывать дочерние процессы в обработчике сигнала; все, что waits в самом подпроцессе, будет блокироваться до тех пор, пока все запущенные дочерние процессы не будут обработаны обработчиком сигнала, а затем произойдет ошибка. Это включает очистку собственного подпроцесса system() и Popen. (См. Popen.communicate() выдает OSError: [Errno 10] Например, нет дочерних процессов.)

person geekosaur    schedule 11.07.2011