2016-08-30 4 views
0

Я решаю следующую проблему:Вызовите функцию момента до сбоя сценария?

У меня есть сценарий, который должен работать как служба 24/7. Поскольку это очень важно, я бы хотел, чтобы он отправил мне электронное письмо в случае его сбоя. Я нашел atexit модуль, но в документах говорится, что он не может справиться с авариями.

Итак, мой вопрос: есть ли лучший способ достичь этого, чем запустить другой serivce, который будет проверять, работает ли этот? Или цель здесь состоит в том, чтобы написать услугу, чтобы она не могла сбой (что почти невозможно)?

Спасибо за ваши идеи!

+0

Как краш-у это крах? Мы говорим о необработанных исключениях здесь или что-то вроде segfault? Обработчики выходных данных atexit будут по-прежнему выполняться в случае необработанного исключения. – user2357112

+0

Вы не можете справляться со всеми типами сбоев, так как некоторые из них являются «неучетными», как упомянуто segfault, или 'SIGTERM'. Вы можете использовать внешний инструмент, например [supervisor] (http://supervisord.org/index.html), который будет обрабатывать запуск/перезапуск для вас и использовать его [события] (http://supervisord.org/events .html), вы можете слушать, например, для процессов, входящих в состояние «FATAL», чтобы отправить электронное письмо. Вложение механизмов для мониторинга процесса в один и тот же процесс является рискованным. – Yakuza

+0

Я посмотрю на инструмент супервизора, кажется, что это единственный правильный aproach. Спасибо – karlosss

ответ

0

Я хочу сделать то, что вы просите в первой части, просто оберните основную часть скрипта с помощью try/except.

myscript.py:

def main(): 
    long_running_process() 

if __name__ == '__main__': 
    try: 
     main() 
    except: 
     send_email() 
+0

В случае ошибки сегментации, у этого нет никакой возможности работать. – karlosss

+0

да, как сказано выше, вам нужен какой-то сервисный монитор, такой как супервизор, выскочка, init.d и т. Д. – postelrich