@nikegk

Как отследить «падение» скрипта?

Добрый день.

Написан небольшой скрипт, который периодически парсит web-страничку. "Демонизирован" этот скрипт с помощью такого класса: Источник.
Сам скрипт работает корректно, но он иногда "падает". Причем может проработать стабильно два месяца и "упасть", а может неделю.

С помощью библиотеки logging скрипт пишет свой лог. По нему определил, что падение происходит после такого кода:
while True:
                try:
                    grab.go(url)
                except Exception as error:
                    logging.error("Ошибка при получении обновленной страницы: %s", error)
                    time.sleep(30)
                else:
                    logging.info("Вывод списка: %s", g.doc.select('//pre')[0].text())
                    break

Думал, что проблема с получением обновленной страницы, но она получается корректно. По логу видно, что срабатывает блок else. После него скрипт останавливается. После этого блока идет еще одна запись в лог, но она не записывается.
Работает это все на CentOS 6.7 (Final). Написан скрипт на python3, версия python 3.4.3, используется библиотека Grab.

Подскажите, как отследить из-за чего "падает" скрипт? Может у самого python'а есть какой-то общий лог, либо в самой системе где-то это можно отследить?
  • Вопрос задан
  • 521 просмотр
Решения вопроса 1
AlexMaxTM
@AlexMaxTM
Вообще при работе с демонами делается следующая схема.
1. Любой демон при старте записывает свой PID в какой-нибудь файл и работает.
2. По крону, допустим каждые 5 секунд, запускается менеджер, который считывает файл(ы) с записанным PID и проверяет жив ли процесс. Если процесс жив, то менеджер завершает свою работу. Если процесс умер, то он поднимает демона, и завершает свою работу.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
sim3x
@sim3x
Не используйте while используйте
https://wiki.archlinux.org/index.php/Systemd/Timer...

One can use systemd-run to create transient .timer units. That is, one can set a command to run at a specified time without having a service file. For example the following command touches a file after 30 seconds:
# systemd-run --on-active=30 /bin/touch /tmp/foo
Ответ написан
Комментировать
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
. По логу видно, что срабатывает блок else. После него скрипт останавливается

Ну так у тебя в else стоит break который заставляет выйти из цикла, всё правильно. Если падает дальше, поставь там try catch с записью в лог, либо просто записывай куда-то вывод программы (python3 main.py &> file.log или используя supervisor например)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы