我目前正在运行一个个人项目,该项目基本上全天候监控一些事情。一个是使用 PhantomJS 的进程,另一个扫描其他一些 API,并在发生某些特定情况时发送电子邮件。
当一切正常运转时,它完全按照我想要的方式运行,但不幸的是,目前,每隔 2-3 天,在深夜通常会发生一些事情,API 扫描器就会冻结。它是用 Python 编写的,每 3 秒运行一次,当我第二天检查日志时,没有崩溃,看起来没有什么异常,但出于某种原因,它停止运行了。
当我有时间时,我最终会着手解决这个问题,但因为它在连续 3 或 4 天内只出现一次,所以很难重现。
对于 PhantomJS 来说……时不时就会崩溃。同样,我们会进行清理,修复这些问题,并可能将其完全替换。
但与此同时,我要爱要做的就是每天每 24 小时重启一次。这绝对不是完美的,但就我目前的做法而言,它可以解决 99% 的问题。
在理想情况下,我会有一个进程列表,并配有一个 PID 列表。每 24 小时一次,在规定的时间内,我希望此控制器运行每个 PID,发送常规终止信号(其中一个与 DB 通信,因此如果可能的话,我希望它安全关闭),然后等待规定的时间段(例如 30 秒),然后sudo kill -9
向 PID 发送信号以应对致命崩溃情况,然后再次运行启动命令。
我已经考虑过是否可以使用Supervisor
它,但它似乎(乍一看)并没有达到我想要的效果。
如果没有完美的单一解决方案,我完全可以使用 2-3 个不同的程序来实现这一点(例如 cron + supervisord + python 脚本),而不是寻找一个。
答案1
我首选的解决方案是 cron 驱动的 Python 脚本,该脚本主要负责在受监控进程未运行时启动它们。它可以自己获取并存储子进程的 PID(如果需要,可能还有其他元数据,例如上次 OK 迭代时间戳)以供以后使用,或者仅监视子进程自己创建的此类文件。
在第一次迭代中,我会利用相对可预测的故障模式/时间线,并修改相应的子进程,使其在指定的迭代次数或总运行时间后干净地退出。监控进程只会重新启动它们。
将来,可以增强监控脚本,以便对正在运行的监控进程进行更详细的健全性分析,并在必要时终止它们。例如,通过检查我上面提到的最后一次 OK 迭代时间戳。这将解决不太可预测的故障模式。
为了实际杀死更复杂的进程结构,您可能需要查看我对这个问题的回答:https://stackoverflow.com/questions/30780487/python-script-to-monitor-process-and-sub-processes。