Как перезапустить сценарий Python автоматически на сбое?

Это сообщение описывает, как поддержать дочерний процесс в сценарии Bash:

Как я пишу сценарий удара для перезапуска процесса, если он умирает?

Это работало отлично для вызова другого сценария Bash.

Однако я пытался выполнить что-то подобное, где дочерний процесс является сценарием Python, daemon.py, который создает разветвленный дочерний процесс, который работает в фоновом режиме:

#!/bin/bash

PYTHON=/usr/bin/python2.6

function myprocess {


$PYTHON daemon.py start

}
NOW=$(date +"%b-%d-%y")

until myprocess; do
     echo "$NOW Prog crashed. Restarting..." >> error.txt
     sleep 1
done

Теперь поведение полностью отличается. Кажется, что сценарий Python больше не является ребенком сценария удара, но, кажется, 'принял' сценарии Bash PID - таким образом, больше нет обертки Bash вокруг названного сценария... почему?

5
задан Community 23 May 2017 в 12:30
поделиться

3 ответа

Процесс-демон выполняет двойную вилку, что является ключевым моментом самонастройки - поэтому PID, который имеет родительский процесс, не имеет значения (он пропал очень скоро после запуска дочернего процесса).

Следовательно, процесс-демон должен записывать свой PID в файл в «известном месте», где по соглашению родительский процесс знает, откуда его читать; при этом (традиционном) подходе родительский процесс, если он хочет действовать как сторожевой таймер перезапуска, может просто считывать PID процесса демона из известного местоположения и периодически проверять, жив ли демон, и перезапускать его при необходимости.

Конечно, при выполнении требуется некоторая осторожность («устаревший» PID будет оставаться в файле «хорошо известное местоположение» некоторое время, и родитель должен это учитывать), и существуют возможные варианты (демон может испускать "сердцебиение", чтобы родитель мог обнаруживать не только мертвых демонов, но и тех, которые "застряли навсегда", например, из-за тупиковой ситуации, поскольку они перестают передавать свое "сердцебиение" [[через широковещательную рассылку UDP и т.п.]] - и т. д. и т. д.), но это общая идея.

5
ответ дан 14 December 2019 в 08:45
поделиться

Похоже, что поведение совершенно другое, потому что здесь ваш "daemon.py" запускается в фоновом режиме как демон.

В другой ссылке вы указали, что исследуемый процесс не демон, он не запускается в фоновом режиме. Программа запуска просто ждет вечной остановки дочернего процесса.

Есть несколько способов преодолеть это. Классический - это способ, которым @Alex объясняет, используя некоторый pid-файл в обычных местах.

Другой способ - создать сторожевой таймер внутри вашего запущенного демона и демонизировать сторожевой таймер ... это имитирует правильный процесс, который не прерывается случайным образом (чего не должно происходить) ...

{{ 1}}
0
ответ дан 14 December 2019 в 08:45
поделиться

Вам следует ознакомиться с предложением по усовершенствованию Python 3143 (PEP) здесь . В нем Бен предлагает включить библиотеку демона в стандартную библиотеку python. Он просматривает МНОГО очень хорошей информации о демонах, и его довольно легко читать. Эталонная реализация здесь .

3
ответ дан 14 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: