Сценарий python supervisord: статус выхода 1; не ожидается в цикле

Я пытаюсь запустить следующий код Python с помощью supervisord, но он начинает перезапускаться, как только я запускаю supervisord -c /etc/supervisord.conf
Пожалуйста, посоветуйте?

import urllib2
import time

def goget():
    url = "http://hitch.tv/grabs.php"
    data = urllib2.urlopen(url)
    grabbedpic = data.read()

    with open('/root/python/tmp.txt', 'r') as tmpfile:
        last=tmpfile.read().replace('\n','')

    msgstr = []
    u = 'http://hitch.tv/'

    print last
    if grabbedpic == last:
        print "same pic"
    else:
        msgstr = u + grabbedpic
        //send email with msgstr here 

        with open('tmp.txt', 'w') as tmpfile:
            tmpfile.write(grabbedpic)

    time.sleep(15)

while True:
    goget()

вот вывод журнала из supervisord.log

> 2014-02-19 22:44:17,993 INFO spawned: 'front' with pid 19859
> 2014-02-19 22:44:19,278 INFO exited: front (exit status 1; not
> expected) 2014-02-19 22:44:20,284 INFO spawned: 'front' with pid 19860
> 2014-02-19 22:44:21,516 INFO exited: front (exit status 1; not
> expected) 2014-02-19 22:44:23,523 INFO spawned: 'front' with pid 19862
> 2014-02-19 22:44:24,805 INFO exited: front (exit status 1; not
> expected) 2014-02-19 22:44:27,814 INFO spawned: 'front' with pid 19863
> 2014-02-19 22:44:29,004 INFO exited: front (exit status 1; not
> expected) 2014-02-19 22:44:30,006 INFO gave up: front entered FATAL
> state, too many start retries too quickly

из supervisord.conf

[program:front]
command=python /root/python/front.py
process_name = front
autostart = true
autorestart = true
startsecs = 10
stopwaitsecs = 30

person phill    schedule 20.02.2014    source источник
comment
выход с ненулевым статусом, вероятно, означает, что интерпретатор Python завершает работу, потому что он поймал исключение; обычно он печатает трассировку на своем stderr, который может быть где-то в журнале; возможно /var/log/messages? Если вы нигде не можете его найти, вам следует перехватить исключение самостоятельно и зарегистрировать его там, где вы можете его найти.   -  person SingleNegationElimination    schedule 20.02.2014
comment
Я запускал скрипт Python в терминале в течение 15 минут без ошибок. Я добавил строку stdout_logfile=/etc/front.log в файл supervisord.conf, и он просто выводит значение для «последнего» 4 раза в журнале.   -  person phill    schedule 21.02.2014
comment
сообщения об ошибках не выводились на стандартный вывод; используйте stderr_logfile или redirect_stderr с текущим stdout_logfile. Также, вероятно, не лучшая идея помещать ведение журнала в /etc; как насчет /var/log?   -  person SingleNegationElimination    schedule 21.02.2014
comment
Вы нашли решение?   -  person Aurel    schedule 12.03.2014
comment
Я думаю, что журналы находятся в /var/log/supervisor/ по умолчанию. app stderr, app stdout и журналы супервизора создаются там.   -  person eggonlegs    schedule 19.03.2014


Ответы (1)


Как упоминалось в комментарии eggonlegs, вы можете просмотреть дополнительные журналы, проверив свой каталог /var/log/supervisor/. У меня была точно такая же проблема, и я обнаружил, что был создан следующий файл:

celery_worker-stderr---supervisor-DEjyLf.log

(Название моей программы [program:front]).

Изучив его, я выяснил, что:

  File "/usr/lib/python3.4/logging/__init__.py", line 1006, in __init__
    StreamHandler.__init__(self, self._open())
  File "/usr/lib/python3.4/logging/__init__.py", line 1030, in _open
    return open(self.baseFilename, self.mode, encoding=self.encoding)
PermissionError: [Errno 13] Permission denied: '/devel.log'

Итак, моя проблема была связана с разрешениями, поскольку я не указывал directory в своем файле celery_worker.conf. После указания:

directory = /path/to/logs/

Все работало отлично.

Возможно, это не та же самая ошибка, но проверка этих журналов stderr или stdout определенно поможет.

person vabada    schedule 29.03.2016