我在Docker容器中运行以下Python程序。
基本上,如果Python进程正常退出(例如,当我手动停止容器时),或者Python进程崩溃(在some_other_module.do_work()
内时),那么我需要进行一些清理并ping数据库以告知它进程已退出。
完成此操作的最佳方法是什么?我看到他们在main()
上进行尝试的一个答案,但这似乎有点奇怪。
我的代码:
def main():
some_other_module.do_work()
if __name__ == '__main__':
main()
答案 0 :(得分:4)
我认为额外的清理工作将由不同的进程完成,因为主进程可能已经以无法恢复的方式崩溃了(我以这种方式理解了这个问题)。
最简单的方法是在以下情况下,主进程在某处设置标志(也许在指定位置创建文件,或者在数据库表中创建列值;还可以包括设置标志的主进程的PID)。它会正常启动并删除(或取消设置)相同的标志。
清理过程只需要检查标志:
答案 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