我有几个脚本用于进行网页抓取。他们总是在奔跑,永远不应该停下来。然而,大约一个星期后,他们系统地“冻结”:没有输出,没有响应Ctrl + C或任何东西。唯一的方法是kill
进程并重新启动它。
我怀疑这些问题来自我用于检索数据的库(urllib2
),但问题很难再现。
因此我想知道如何检查进程的状态并在冻结时自动终止/重启它。我正在考虑创建一个PID文件,并定期更新它。然后,另一个脚本可以定期检查此PID文件的最后修改日期,如果它太旧,则重新启动该过程。我可以使用Monit之类的东西来进行监控。
这是我应该怎么做的?是否有另一种最佳实践/常用方法来检查流程的响应性?
答案 0 :(得分:2)
如果您的进程始终在运行,没有连接的终端,并且是进程组负责人 - 这是一个守护进程。你无疑知道这一切。
在这样的编码程序中有一些事实上的做法。一种是拥有一个信号处理程序,它接受SIGHUP并强制程序重新初始化自己。这意味着关闭所有打开的日志文件,重新读取配置脚本等。我不知道这对您的问题有多适用,但它有时会解决我工作中的冻结守护进程等问题。
您可以使用SIGUSR1
和SIGUSR2
信号来执行特殊操作,例如将状态写入文件或其他任何内容,从而自定义该想法。由于信号进入中断,脚本中的trap语句和python本身的信号处理程序会将程序状态推送到中断堆栈并执行“填充”。
在你的情况下,你可能想要程序fork / exec本身,然后杀死父。