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

标签 python python-2.7 supervisord

我有一个在主管下运行的 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/

相关文章:

python - 在 Pandas 列中将 float 转换为整数

python - 合并具有相同键和不同值的两个字典

python - 在安装时检测 Python 传递依赖问题?

linux - supervisord 是否使用重启命令终止正在运行的进程?

django - 在控制台而不是日志文件中查看主管执行

python - Networkx 图中的哪些元素可能成为 Neo4j 图中的标签?

python - 按日期排序字典列表

python - 属性错误 : 'Sequential' object has no attribute 'total_loss'

java - Python 中的 toByteArray?

python - 重新加载 supervisord 会导致其下的进程停止吗?