Подтвердить что ты не робот

Daemon vs Upstart для python script

Я написал модуль в Python и хочу, чтобы он работал непрерывно после запуска и должен был остановить его, когда мне нужно обновить другие модули. Я, скорее всего, буду использовать monit, чтобы перезапустить его, если модуль разбился или в противном случае не работает.

Я проходил различные методы, такие как Daemon, Upstart и многие другие.

Какой лучший способ пойти так, что я использую этот подход через все мои новые модули, чтобы поддерживать их навсегда?

4b9b3361

Ответ 1

Из вашего упоминания о Upstart я буду считать, что этот вопрос предназначен для службы, запущенной на сервере Ubuntu.

На сервере Ubuntu вышестоящее задание - это самый простой и удобный вариант для создания всегда службы, которая запускается в нужное время и может быть остановлена ​​или перезагружена знакомыми командами.

Чтобы создать услугу выскочки, вам нужно добавить один файл в /etc/init. Вызывается <service-name>.conf. Пример script выглядит следующим образом:

description "My chat server"
author "[email protected]"

start on runlevel [2345]
stop on runlevel [!2345]

env AN_ENVIRONMENTAL_VARIABLE=i-want-to-set

respawn

exec /srv/applications/chat.py

Это означает, что каждый раз, когда машина запускается, она запускает программу chat.py. Если он умирает по какой-либо причине, он перезапустит его. Вам не нужно беспокоиться о двойном форсировании или иначе демонамизировать свой код. Это было для вас выскочкой.

Если вы хотите остановить или запустить свой процесс, вы можете сделать это с помощью

service chat start 
service chat stop

Имя chat будет автоматически найдено из имени файла .conf внутри /etc/init

Я только освещаю основы выскочки здесь. Есть много других возможностей, чтобы сделать его еще более полезным. Все доступно, запустив man upstart.

Этот метод намного удобнее, чем писать собственный код демонизации. Файл конфигурации 4-8 строк для встроенного компонента Ubuntu гораздо менее подвержен ошибкам, чем безопасный двойной код fork, а затем другой монитор процесса, чтобы убедиться, что он не исчезнет.

Монит - это немного красная селедка. Если вы хотите оповещения о простоях, вам все равно нужно запустить программу мониторинга на отдельном сервере. Положитесь на выскочку, чтобы процесс всегда выполнялся на сервере. Затем выполните другую службу, которая гарантирует, что сервер фактически запущен. Простоя происходит по разным причинам. Процесс, выполняющийся на том же сервере, ничего вам не скажет, если сам сервер опустится. Вам нужна отдельная машина (или сторонний поставщик, такой как pingdom), чтобы предупредить вас об этом состоянии.

Ответ 2

Вы можете проверить supervisor. То, на что оно способно, - это запустить процесс при запуске системы, а затем сохранить его до выключения.

Самый простой файл конфигурации:

[program:my_script]
command = /home/foo/bar/venv/bin/python /home/foo/bar/scripts/my_script.py
environment = MY_ENV_VAR=FOO, MY_OTHER_ENV_VAR=BAR
autostart = True
autorestart = True

Затем вы можете связать его с /etc/supervisord/conf.d, запустите sudo supervisorctl, чтобы войти в консоль управления супервизора, введите reread, чтобы супервизор заметил новую запись конфигурации и update для отображения новых программ в списке status.

Чтобы запустить/перезапустить/остановить программу, вы можете выполнить sudo supervisorctl start/restart/stop my_script.

Ответ 3

Я использовал initscript старого стиля с помощью утилиты start-stop-daemon. Посмотрите на skel в/etc/init.d