Скрипт Python как служба/демон linux
Здравствуй,
Я пытаюсь позволить скрипту python работать как служба (демон) на (ubuntu) linux.
в интернете существует несколько решений, таких как:
http://pypi.python.org/pypi/python-daemon/
хорошо управляемый процесс демона Unix сложно получить правильно, но необходимые шаги во многом одинаковы для каждой программы демона. Экземпляр DaemonContext содержит поведение и настроенную среду процесса для используйте экземпляр в качестве контекстного менеджера для входа в состояние демона.
http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
однако, поскольку я хочу интегрировать свой скрипт python специально с ubuntu linux, мое решение представляет собой комбинацию с инициализацией.D скрипт
#!/bin/bash
WORK_DIR="/var/lib/foo"
DAEMON="/usr/bin/python"
ARGS="/opt/foo/linux_service.py"
PIDFILE="/var/run/foo.pid"
USER="foo"
case "" in
start)
echo "Starting server"
mkdir -p "$WORK_DIR"
/sbin/start-stop-daemon --start --pidfile $PIDFILE
--user $USER --group $USER
-b --make-pidfile
--chuid $USER
--exec $DAEMON $ARGS
;;
stop)
echo "Stopping server"
/sbin/start-stop-daemon --stop --pidfile $PIDFILE --verbose
;;
*)
echo "Usage: /etc/init.d/$USER {start|stop}"
exit 1
;;
esac
exit 0
и в python:
import signal
import time
import multiprocessing
stop_event = multiprocessing.Event()
def stop(signum, frame):
stop_event.set()
signal.signal(signal.SIGTERM, stop)
if __name__ == '__main__':
while not stop_event.is_set():
time.sleep(3)
мой вопрос сейчас, если этот подход является правильным. Должен ли я обрабатывать какие-либо дополнительные сигналы? Будет ли это"хорошо управляемый процесс демона Unix"?
2 ответа:
предполагая, что ваш демон имеет какой-то способ непрерывного запуска (какой-то цикл событий, скрученный, что угодно), вы можете попробовать использовать
upstart.вот пример конфигурации выскочки для гипотетической службы Python:
description "My service" author "Some Dude <blah@foo.com>" start on runlevel [234] stop on runlevel [0156] chdir /some/dir exec /some/dir/script.py respawnесли вы сохраните это как сценарий.conf to
/etc/initвы просто делаете один раз$ sudo initctl reload-configuration $ sudo start scriptвы можете остановить его с
stop script. То, что выше выскочка conf говорит, чтобы запустить эту службу при перезагрузке, а также перезапустить его, если он умирает.как для обработка сигналов - ваш процесс должен естественно реагировать на
SIGTERM. По умолчанию это должно быть обработано, если вы специально не установили свой собственный обработчик сигналов.
ответ Rloton хорош. Вот легкая доработка, просто потому, что я потратил кучу времени на отладку. И мне нужно сделать новый ответ, чтобы я мог правильно форматировать.
еще пара пунктов, которые заняли у меня целую вечность, чтобы отладить:
- когда это не удается, сначала проверьте /var/log/upstart/.журнал
- если ваш скрипт реализует демон с python-daemon, вы не используете строфу 'expect daemon'. Не имея "ожидать" работает. Я не знаю, почему. (Если кто знает, почему - пожалуйста, напишите!)
- кроме того, продолжайте проверять "сценарий состояния initctl", чтобы убедиться, что вы (запуск/запуск). (и сделать перезагрузку при обновлении файла conf)
вот мой вариант:
description "My service" author "Some Dude <blah@foo.com>" env PYTHON_HOME=/<pathtovirtualenv> env PATH=$PYTHON_HOME:$PATH start on runlevel [2345] stop on runlevel [016] chdir <directory> # NO expect stanza if your script uses python-daemon exec $PYTHON_HOME/bin/python script.py # Only turn on respawn after you've debugged getting it to start and stop properly respawn