Как обнаружить в подпроцессе, когда родительский процесс умер? - PullRequest
6 голосов
/ 18 апреля 2011

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

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

Ответы [ 2 ]

8 голосов
/ 18 апреля 2011

в UNIX (включая Linux):

def is_parent_running():
    try:
        os.kill(os.getppid(), 0)
        return True
    except OSError:
        return False

Обратите внимание, что в UNIX сигнал 0 не является реальным сигналом. Он используется только для проверки, существует ли данный процесс. См. Руководство по команде kill.

5 голосов
/ 18 апреля 2011

Вы можете использовать socketpair() для создания пары сокетов домена unix перед созданием подпроцесса.Пусть у одного из родителей один конец открыт, а у другого - другой.Когда родитель выходит, его конец сокета отключится.Тогда ребенок будет знать, что он вышел, потому что он может select() / poll() для чтения событий из своего сокета и получения конца файла в это время.

...