我有一个在主管下运行的 python 脚本。
我选择了supervisor,因为它会在机器启动时以及脚本“死亡”时自动启动脚本
它的作用是在执行某些操作后每 3-6 秒继续写入日志文件 running.log
。
如果有异常,它会将异常写入单独的日志文件。
脚本在 5 小时后停止写入 running.log
,尽管在此期间没有出现异常。
它仍然显示为在主管下运行,并且在它应该停止写入 running.log
期间没有异常。
尽管成功执行了 5 个小时,但它还是停止写入 running.log
脚本。
然后我在主管下再次手动重新启动服务。
我有什么选择?
最佳答案
我可以想到两个选择:
1。找到错误
脚本没有响应,但并未死亡。这意味着它本身已经死锁,或者进入无限循环,或者锁定在某些 I/O 过程中或其他什么。
我想说,找到错误并删除它是一个很好的做法!您可以查看代码并感受哪里可能发生这种情况,添加一些日志详细信息或类似内容。或者你可以调试它。有一些机制可以将调试器附加到正在运行的 Python 脚本: https://wiki.python.org/moin/DebuggingWithGdb
您需要获得权限才能执行此操作。如果它是生产代码,那么这是个坏消息……但是在生产机器中存在未检测到的未定义错误感觉不太对劲。那么也许您可以设置一些舞台机器并在那里调试脚本?这样你就可以找到问题出在哪里。
2。添加一些看门狗机制
您可以添加一些进程来观看脚本。事实上,脚本本身可以将其多进程
转化为某种东西来观察日志文件的修改时间。骨架(未经测试):
def watch(watch_path):
last_modified = <get modification time of watch_path>
while True:
<sleep>
if <check modification times>:
<kill> os.getppid() # kill parent process
else:
last_modified = <get modification time>
...
p = multiprocessing.Process(target=watch, args=(log_output_path,))
关于python - 如果脚本停止工作但仍显示在主管下运行,如何重新启动脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42622096/