2010-04-26 7 views
5

Это сообщение описывает, как сохранить дочерний процесс живой в BASH сценарий:Как автоматически перезапустить скрипт python при ошибке?

How do I write a bash script to restart a process if it dies?

Это работало отлично подходит для вызова другого Баш скрипт.

Однако, я пытался что-то подобное выполнение, когда дочерний процесс является сценарий 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-оболочки вокруг вызываемого скрипта ... почему?

+3

Это поможет узнать, что находится в daemon.py, но из имени, которое я предполагаю, это «exec» или что-то вроде эквивалента python, чтобы помещать себя в фоновом режиме. –

+0

. Вт ч а т? –

+0

отредактирован для описания daemon.py – chris

ответ

5

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

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

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

0

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

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

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

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

3

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

+0

Спасибо за ссылку Пол. Выглядит полезно. – chris

-1

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

простой га

Надоело keepalived, corosync, кардиостимулятор, сердцебиение или любой другой? Здесь простой демон, обеспечивающий Heartbeat между двумя хостами.Один из них активен, а другой - резервный, запуск сценария при изменении состояния. Простая реализация, KISS. Производство готово (по крайней мере, оно работает для меня :)

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

+1

Хотя это теоретически может ответить на вопрос, [было бы предпочтительнее] (// meta.stackoverflow.com/q/8259) включить сюда основные части ответа и предоставить ссылку для справки. –

+0

Спасибо за указание. Я попытаюсь обновить это как можно скорее. –

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