我用while true
编写了一个python脚本来执行捕获电子邮件附件的任务,但有时我发现它会在服务器上意外退出。
我在本地运行它超过4个小时没有问题,所以我可以确认代码是正确的。
有没有一种机制在意外退出时重启python,比如进程监控?我是linux的新手。
备注:我在shell脚本中运行这个python脚本,如python attachment.py &
。
答案 0 :(得分:2)
虽然@ triplee的评论肯定会成功,但我担心会发生一些事情,你会更好地理解。也就是说,脚本失败的原因。
如果没有进一步的细节,很难推测可能发生的事情。作为第一个调试工作,您可以尝试将整个主体包装在while True
块中的try ... except...
内,并使用except
块来记录错误和/或程序状态。也就是说,
while True:
try:
... do some stuff...
except:
... log the exception, print to screen, record the values of key variables, etc.
continue
这将使您能够了解失败期间发生的情况,并编写更强大的代码来处理该事件。
答案 1 :(得分:0)
您可以尝试使用Supervisor来管理您的流程。 Supervisor能够配置进程退出状态的bevhiour并尝试重新启动它。
附加的是official document和example in Ubuntu:
示例配置
[program:nodehook]
command=/usr/bin/node /srv/http.js
directory=/srv
autostart=true
autorestart=true
startretries=3
stderr_logfile=/var/log/webhook/nodehook.err.log
stdout_logfile=/var/log/webhook/nodehook.out.log
user=www-data
environment=SECRET_PASSPHRASE='this is secret',SECRET_TWO='another secret
答案 2 :(得分:0)
我在本地运行它超过4个小时没有问题,所以我可以确认代码是正确的。
你可能会惊讶于几个月之后才会发现的错误数量,如果没有多年的正确处理...你确认的是代码不会在第一次操作时中断,但除非你用所有可能的角落测试它输入中的情况(包括格式错误的情况)你无法确认它永远不会中断。
这就是为什么一个意图无意中运行的程序应该经过精心设计,以便在退出之前始终(尝试 * )留下痕迹的原因。 try: except:
和logging
模块是您最好的朋友。
* 在系统崩溃或断电的情况下,您无法在用户程序级别执行任何操作......