2014-08-18 2 views
2

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

Я использую подпроцесс с резьбой для мониторинга stdout/stderr длинного пробега command, который будет непрерывно генерировать какое-то выходное сообщение.

Образец фрагмент кода выглядит следующим образом:

class PS(threading.Thread): 
    def __init__(self, command): 
     threading.Thread.__init__(self) 
     self.command = command 

    def run(self): 
     try: 
      process = subprocess.Popen(self.command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
      for line in iter(process.stdout.readline, ''): 
       ''' do something to line''' 

Когда мой питон основной программы прекращается (убить его PID, например), его ребенок процесс (command исполняется PS класса) все еще жив, как фоновый процесс.

Мой вопрос в том, есть ли способ в python «повторно подключить» дочерний процесс, чтобы я мог следить за его stdout/stderr?

P.S. Мне это нужно только в среде linux, более конкретно в ubuntu 14.04.

+0

Ребенок, вероятно, умрет, если попытается записать его стандартный вывод после выхода родителя, поскольку его стандартный вывод был трубкой, другой конец которой был родительским, а не файлом. – chepner

+1

@chepner Я не знаю, как, но я уверен, что дочерний процесс жив. – user1817188

+1

Но он все еще производит выход? Даже если он каким-то образом забуферирован, программа все равно может потерять некоторый выход в зависимости от того, сколько времени потребуется для повторного подключения. Просто напишите в файл и родитель должен прочитать из файла, а не в трубку. – chepner

ответ

1

Когда стандартный вывод дочернего элемента привязан к трубе, ребенок будет получать сигнал SIGPIPE, если он попытается записать этот канал после того, как родительский матрица исчезнет, ​​поскольку удаленный конец канала больше не существует.

Чтобы ребенок оставался родителем и чтобы родитель мог возобновить работу, вы должны просто записать его в файл и вместо этого родительский текст будет прочитан из этого файла.

Смежные вопросы