如果脚本停止工作但仍显示为在主管下运行,如何重新启动脚本

时间:2017-03-06 09:38:13

标签: python python-2.7 supervisord

我有一个在主管下运行的python脚本。

我选择了主管,因为它会在机器启动时自动启动脚本,并且当脚本应该“#34;死掉”#34;

它的作用是在执行某些操作后每隔3-6秒继续写入日志文件running.log

如果有异常,它会将异常写入单独的日志文件。

脚本在5小时后停止写入running.log,尽管在此期间没有例外。

它仍显示为在主管下运行,并且在它应该停止写入running.log期间没有例外。

然而,尽管已经成功地进行了5小时,但它仍停止写入running.log脚本。

然后我在主管下再次手动重启服务。

我有什么选择?

1 个答案:

答案 0 :(得分:1)

我可以想到两个选择:

1。找到错误

脚本没有响应,但没有死。这意味着它已经陷入僵局,或者进入无限循环,或者锁定在某些I / O过程或其他任何过程中。

我会说找到错误并删除它是一个很好的行动方案!您可以查看代码并了解可能发生的位置,添加一些日志详细程度或类似内容。或者你可以调试它。有一些机制可以将调试器附加到正在运行的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,))