2015-09-23 6 views
1

I скопирован из here, чтобы запустить мой код Python в качестве демона. Для дополнительного времени безотказной работы. Я подумал, что было бы лучше использовать супервайзер, чтобы этот демон работал.Запустите скрипт python с супервизором

Я сделал это. python_deamon.conf

[program:python_deamon] 
directory=/usr/local/python_deamon/ 
command=/usr/local/python_venv/bin/python daemon_runnner.py start 
stderr_logfile=/var/log/gunicorn.log 
stdout_logfile=/var/log/gunicorn.log 
autostart=true 
autorestart=true 

Проблема заключается в том, что хотя руководитель успешно запускает python_daemon он держит заново попытать.

2015-09-23 16:10:45,592 CRIT Supervisor running as root (no user in config file) 
2015-09-23 16:10:45,592 WARN Included extra file "/etc/supervisor/conf.d/python_daemon.conf" during parsing 
2015-09-23 16:10:45,592 INFO RPC interface 'supervisor' initialized 
2015-09-23 16:10:45,592 CRIT Server 'unix_http_server' running without any HTTP authentication checking 
2015-09-23 16:10:45,592 INFO supervisord started with pid 13880 
2015-09-23 16:10:46,595 INFO spawned: 'python_deamon' with pid 17884 
2015-09-23 16:10:46,611 INFO exited: python_deamon (exit status 1; not expected) 
2015-09-23 16:10:47,614 INFO spawned: 'python_deamon' with pid 17885 
2015-09-23 16:10:47,630 INFO exited: python_deamon (exit status 1; not expected) 
2015-09-23 16:10:49,635 INFO spawned: 'python_deamon' with pid 17888 
2015-09-23 16:10:49,656 INFO exited: python_deamon (exit status 1; not expected) 
2015-09-23 16:10:52,662 INFO spawned: 'python_deamon' with pid 17891 
2015-09-23 16:10:52,680 INFO exited: python_deamon (exit status 1; not expected) 
2015-09-23 16:10:53,681 INFO gave up: python_deamon entered FATAL state, too many start retries too quickly 

Только для записи после перекрывая run() метод, который я никогда ничего не вернуть.

Можно ли делать то, что я пытаюсь сделать, или я тупой?

P.S: Я знаю, что основная причина всей проблемы является то, что с тех пор запуск() никогда не возвращает ничего супервизор продолжает пытаться запустить его и, следовательно, считает, что этот процесс не удался, и дает статус FATAL Exited too quickly (process log may have details).

Мой фактический вопрос: я делаю это правильно? или это можно сделать таким образом?

P.P.S: Автономный (без надзора) daemon_runnner.py работает отлично с разрешениями sudo и без них.

+0

Вы проверили 'daemon_runnner.py' без демона? Он выходит со статусом 1. – wenzul

ответ

2

пытается установить startsecs = 0:

[program:foo] 
command = ls 
startsecs = 0 
autorestart = false 
http://supervisord.org/configuration.html 

startsecs 

Общее количество секунд, в течение которых программа должна оставаться в рабочем состоянии после запуска, чтобы считать начало успешным. Если программа не останавливается на протяжении многих секунд после ее запуска, даже если она выйдет с «ожидаемым» кодом выхода (см. Коды выхода), запуск будет считаться сбоем. Установите значение 0, чтобы указать, что программа не должна оставаться включенной в течение определенного периода времени.

0

Ваш сценарий не работает с статусом выхода. Супервизор просто пытается перезапустить скрипт.

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

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

-1

Не уверены, что если речь идет то же самое с демоном бегуном, но если вы используете контекст демона напрямую и использовать supervisord, вам необходимо установить context.detach_process на Ложный

0

Это то, что я обычно делаю:

  • Создать service.conf файл, который описывает новый сценарий Python. Этот скрипт ссылается на сценарий оболочки, который в действительности запускает скрипт Python. Этот файл .conf живет в /etc/supervisor/conf.d
  • Создайте сценарий оболочки, который запускает скрипт Python. Измените права на исполняемый файл. chmod 755 service.sh. В этом скрипте мы фактически запускаем скрипт Python.
  • Настройте log_stderr и stderr_logfile для проверки проблемы.
  • Update супервизор с помощью перезагрузки, а затем проверить статус:

супервизор> Статус

alexad RUNNING Pid 32657, аптайм 0:21:05

service.conf

[program:alexad] 
; Set full path to celery program if using virtualenv 

command=sh /usr/local/src/gonzo/supervisorctl/alexad.sh 
directory=/usr/local/src/gonzo/services/alexa 
log_stdout=true    ; if true, log program stdout (default true) 
log_stderr=true    ; if true, log program stderr (default false) 
stderr_logfile=/usr/local/src/gonzo/log/alexad.err 
logfile=/usr/local/src/gonzo/log/alexad.log 
autostart=true 
autorestart=true 
startsecs=10 

; Need to wait for currently executing tasks to finish at shutdown. 
; Increase this if you have very long running tasks. 
stopwaitsecs = 600 

; When resorting to send SIGKILL to the program to terminate it 
; send SIGKILL to its whole process group instead, 
; taking care of its children as well. 
killasgroup=true 

; Set Celery priority higher than default (999) 
priority=500 

service.sh

#!/bin/bash 
cd /usr/local/src/gonzo/services/alexa 
exec python reader.py