Это сообщение описывает, как поддержать дочерний процесс в сценарии 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 вокруг названного сценария... почему?
Процесс-демон выполняет двойную вилку, что является ключевым моментом самонастройки - поэтому PID, который имеет родительский процесс, не имеет значения (он пропал очень скоро после запуска дочернего процесса).
Следовательно, процесс-демон должен записывать свой PID в файл в «известном месте», где по соглашению родительский процесс знает, откуда его читать; при этом (традиционном) подходе родительский процесс, если он хочет действовать как сторожевой таймер перезапуска, может просто считывать PID процесса демона из известного местоположения и периодически проверять, жив ли демон, и перезапускать его при необходимости.
Конечно, при выполнении требуется некоторая осторожность («устаревший» PID будет оставаться в файле «хорошо известное местоположение» некоторое время, и родитель должен это учитывать), и существуют возможные варианты (демон может испускать "сердцебиение", чтобы родитель мог обнаруживать не только мертвых демонов, но и тех, которые "застряли навсегда", например, из-за тупиковой ситуации, поскольку они перестают передавать свое "сердцебиение" [[через широковещательную рассылку UDP и т.п.]] - и т. д. и т. д.), но это общая идея.
Похоже, что поведение совершенно другое, потому что здесь ваш "daemon.py" запускается в фоновом режиме как демон.
В другой ссылке вы указали, что исследуемый процесс не демон, он не запускается в фоновом режиме. Программа запуска просто ждет вечной остановки дочернего процесса.
Есть несколько способов преодолеть это. Классический - это способ, которым @Alex объясняет, используя некоторый pid-файл в обычных местах.
Другой способ - создать сторожевой таймер внутри вашего запущенного демона и демонизировать сторожевой таймер ... это имитирует правильный процесс, который не прерывается случайным образом (чего не должно происходить) ...
{{ 1}}Вам следует ознакомиться с предложением по усовершенствованию Python 3143 (PEP) здесь . В нем Бен предлагает включить библиотеку демона в стандартную библиотеку python. Он просматривает МНОГО очень хорошей информации о демонах, и его довольно легко читать. Эталонная реализация здесь .