检测Python程序何时退出或崩溃的好方法是什么?

时间:2019-02-19 17:54:49

标签: python python-3.x

我在Docker容器中运行以下Python程序。

基本上,如果Python进程正常退出(例如,当我手动停止容器时),或者Python进程崩溃(在some_other_module.do_work()内时),那么我需要进行一些清理并ping数据库以告知它进程已退出。

完成此操作的最佳方法是什么?我看到他们在main()上进行尝试的一个答案,但这似乎有点奇怪。

我的代码:

def main():
    some_other_module.do_work()

if __name__ == '__main__':
    main()

4 个答案:

答案 0 :(得分:4)

我认为额外的清理工作将由不同的进程完成,因为主进程可能已经以无法恢复的方式崩溃了(我以这种方式理解了这个问题)。

最简单的方法是在以下情况下,主进程在某处设置标志(也许在指定位置创建文件,或者在数据库表中创建列值;还可以包括设置标志的主进程的PID)。它会正常启动并删除(或取消设置)相同的标志。

清理过程只需要检查标志:

  • 如果设置了该标志但是主进程已经结束(该标志可能包含主进程的PID,那么清除进程将使用该ID来查找主进程是否仍在运行),则清除是按顺序。
  • 如果设置了标志并且主进程正在运行,则什么也不做。
  • 如果未设置该标志,则什么也不做。

答案 1 :(得分:1)

尝试主捕获似乎最简单,但不适用于/可能不适用于大多数事情(请参阅下面的评论)。您始终可以except特定例外:

def main():
    some_other_module.do_work()

if __name__ == '__main__':
    try:
        main()
    except Exception as e:
        if e == "<INSERT GRACEFUL INTERRUPT HERE>":
            # finished gracefully
        else:
            print(e)
            # crash

答案 2 :(得分:1)

使用try/except

def thing_that_crashes():
    exit()

try:
    thing_that_crashes()
except:
    print('oh and by the way, that thing tried to kill me')

我认为不可能捕捉到具有高级自杀行为的进程(我不知道自己发送了SYGKILL或其他东西),因此,如果您需要您的主流程能够经受住发生的一切,也许可以在子流程中运行另一个流程

答案 3 :(得分:1)

您可以将脚本与另一个subprocess脚本一起包装并检查returncode。受此Relevant question.

的启发
from subprocess import Popen

script = Popen("python abspath/to/your/script.py")
script.communicate()
if script.returncode <> 0:
    # something went wrong
    # do something about it