Як запустити сценарій Python у фоновому режимі та перезапустити його після збоїв?


10

У мене дуже простий скрипт Python, який я хотів би завжди працювати на своєму сервері Ubuntu 12.04. Я думав скористатися upstart + monit. Проблема полягає в тому, що ці інструменти здаються досить складними для простого смертного, як я, і я не можу знайти простий приклад в Інтернеті.

Невдалий + моніт надмір? Хтось знає простішу альтернативу, чи гарний підручник для початківців + моніт? Якщо я просто хочу бути впевненим, що сценарій завжди працює, чи потрібно взагалі монітор?


Для довідки, саме таке питання було задано тут: 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

Якщо ваш сценарій - це щось довільне і унікальне для цього конкретного сценарію, а "щось" - це те саме, що назва роботи (наприклад, /etc/init/something.confзапропонована раніше).


Ага! Отже, це upstartправильно? Чи означає це, що сценарій також буде запущений під час завантаження (що було б чудово!)? І respawnцього достатньо, щоб вам не потрібно було налаштовувати monit?
sebpiq

Так, "запуск на рівні запуску [2345]" означає час, коли система переходить у "режим багатокористувацького користування". В довгостроковій перспективі складається план замінити дуже старий unixy "runlevel" на такі речі, як "старт при запуску мережевих служб" і "зупинка при зупинці мережевих служб", щоб він читав більш логічно.
SpamapS

Дивовижно! Велике спасибі, саме це мені було потрібно.
sebpiq

2

Звичайним підходом з давніх часів було написати файл, що містить часову марку чи ідентифікатор процесу, /tmpа потім перевірити, чи цей ідентифікатор процесу все ще працює чи респективно, якщо штамп часу був останнім часом.

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

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


сценарій просто обриває твіти з твіттерів за допомогою потокового API. Так що в основному існує нескінченна петля, яка чекає, коли твіти будуть натиснуті, виконавши якийсь код, і повернутися до очікування. Я просто хочу, щоб це працювало, не хвилюючись ... якщо є помилка і вона виходить з ладу і так далі ...
sebpiq

Аналогічна відповідь на вашу (яку я прийняв): superuser.com/questions/461546/…
sebpiq

Також хорошою ідеєю може бути також завдання з перегляду cron, щоб перевірити, чи не працює сценарій.
con-f-use
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.