我有一个在supervisor下运行的python脚本。
我选择了supervisor,因为它会在机器启动时自动启动脚本,当脚本“死”的时候
它所做的是,在执行某些操作后,它将每隔3-6秒继续写入日志文件running.log。
如果有异常,它会将异常写入一个单独的日志文件。
脚本在5小时后停止写入running.log,尽管在此期间没有任何异常。
它仍然显示为在supervisor下运行,并且在其理应停止写入running.log的时间内没有异常。
然而,它停止了对running.log脚本的写入,尽管成功执行了5个小时。
然后,我在supervisor下手动重新启动了该服务。
我有什么选择?
发布于 2017-03-06 19:59:11
我能想到两个选择:
1.找到bug
脚本没有响应,但还没有死。这意味着它已经死锁了自己,或者进入了无限循环,或者被锁定在某个I/O过程中,或者其他什么。
我要说的是,找到bug并移除它是一个很好的行动!您可以查看代码并感觉可能发生的情况,添加一些日志详细信息或类似的内容。或者您可以对其进行调试。有一些机制可以将调试器附加到正在运行的Python脚本:https://wiki.python.org/moin/DebuggingWithGdb
您需要权限才能执行此操作。如果这是一个生产代码,那就是坏消息……但是,在生产机器中有一个未检测到的未定义的错误感觉并不正确。所以也许你可以设置一些舞台机器并在那里调试脚本?这样你就可以找到问题出在哪里了。
2.添加一些看门狗机制
您可以添加一些进程来查看脚本。事实上,脚本本身可以将其multiprocess成某种东西,以观察日志文件的修改时间。骨架(未测试):
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,))https://stackoverflow.com/questions/42622096
复制相似问题