Как автоматически перезапустить скрипт Python при сбое? - PullRequest
5 голосов
/ 26 апреля 2010

В этом посте описывается, как поддерживать дочерний процесс в сценарии BASH:

Как мне написать 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 - поэтому больше нет оболочки BASH вокруг вызываемого сценария ... почему?

Ответы [ 4 ]

5 голосов
/ 26 апреля 2010

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

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

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

3 голосов
/ 26 апреля 2010

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

0 голосов
/ 12 ноября 2016

Использовать 'https://github.com/ut0mt8/simple-ha'.

simple-ha

Устали от активности, сердечного ритма, кардиостимулятора, пульса или чего-либо еще?Здесь простой демон, который обеспечивает сердцебиение между двумя хостами.Один активен, а другой - резервное копирование, запускающий скрипт при изменении состояния.Простая реализация, ПОЦЕЛУЙ.Производство готово (по крайней мере, у меня это работает:)

Жизнь будет слишком легкой!

0 голосов
/ 26 апреля 2010

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

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

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

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

...