Как запустить скрипт Python в фоновом режиме и перезапустить его после сбоя?

У меня очень простой скрипт на Python, который я хотел бы всегда запускать на своем сервере Ubuntu 12.04. Я думал об использовании upstart + monit. Проблема в том, что эти инструменты кажутся довольно сложными для простого смертного, такого как я, и я не могу найти простой пример в Интернете.

Является ли upstart + monit overkill? Кто-нибудь знает более простую альтернативу или хороший учебник для upstart + monit? Если я просто хочу убедиться, что скрипт всегда запущен, требуется ли мониторинг вообще?

10
задан 14 August 2012 в 20:20

2 ответа

Простейший способ сделать это - поместить это в /etc/init/something.conf:

start on runlevel [2345]
stop on runlevel [016]

respawn
exec python /path/to/your/script.py

Respawn запустит его, если он убит или выйдет с ненулевым значением (как неперехваченное исключение). Это будет работать, начиная с Ubuntu 10.04.

Если у вас есть 12.04, вы можете получить больше фантазии. Выше будет запускать ваш скрипт от имени root. В 12.04 вы можете добавить setuid / setgid:

start on runlevel [2345]
stop on runlevel [016]

respawn
setuid nobody
setgid nogroup
exec python /path/to/your/python.py

Если ваш скрипт завершает работу, когда нет доступной сети, и вы планируете запустить его по нестабильному сетевому соединению, хорошо, вы должны это исправить и просто сделать это остаться в живых / повторить попытку. Но если вы не можете, вам также может понадобиться запускать его вручную всякий раз, когда подключается сетевое устройство. Таким образом, вы можете поместить это в /etc/network/if-up.d/yourscript (сделать его исполняемым с помощью chmod + x)

#!/bin/sh
exec start wait-for-state WAITER=$IFACE-yourscript WAIT_FOR=something

Где yourscript - это просто нечто произвольное и уникальное для этого конкретного скрипта, а «нечто» - то же самое, что и задание имя (например, /etc/init/something.conf, предложенный ранее).

0
ответ дан 14 August 2012 в 20:20

Обычный подход старых времен заключался в том, чтобы записать файл, содержащий метку времени или идентификатор процесса, в /tmp, а затем проверить, был ли этот идентификатор процесса все еще запущен или, соответственно, если метка времени была еще недавно.

Также вы можете сделать простое while [ 1 ]; do phyton-script.ph; done, которое перезапустит скрипт в случае его возврата.

Для получения дополнительной информации, пожалуйста, предоставьте больше информации о вашем сценарии. Особенно о том, почему вы ожидаете, что он неожиданно выйдет из строя или потерпит крах.

0
ответ дан 14 August 2012 в 20:20

Другие вопросы по тегам:

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