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

10

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

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

sebpiq
источник
Для справки, тот же самый вопрос был задан здесь: superuser.com/q/461546/786969
PHPirate

Ответы:

16

Самый простой способ сделать это - поместить это в /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предложенным ранее).

SpamapS
источник
Да уж ! Так что это upstartправильно? Означает ли это, что скрипт также будет запущен при загрузке (что было бы здорово!)? И respawnдостаточно, чтобы вам не нужно было настраивать monit?
Себпик
Да, «запуск на уровне выполнения [2345]» означает, когда система переходит в «многопользовательский режим». В долгосрочной перспективе существует план, который заменит очень старый unixy «уровень запуска» такими вещами, как «запуск при запуске сетевых служб» и «остановка при остановке сетевых служб», чтобы он читал более логично.
SpamapS
Потрясающие ! Большое спасибо, это именно то, что мне было нужно.
sebpiq
2

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

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

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

кон-е использование
источник
скрипт просто удаляет твиты из твиттеров с помощью потокового API. В общем, существует бесконечный цикл, ожидающий отправки твитов, выполнения некоторого кода и возврата к ожиданию. Я просто хочу, чтобы это работало, не беспокоясь ... если есть ошибка и она падает, и так далее ...
sebpiq
Аналогичный ответ на ваш (который я принял): superuser.com/questions/461546/…
sebpiq
Также хорошей идеей может быть задание cron, чтобы проверить, работает ли скрипт.
con-f-use