Python 如何检测无响应/冻结的进程?

Python 如何检测无响应/冻结的进程?,python,unix,process,monitoring,Python,Unix,Process,Monitoring,我有几个脚本,我用来做一些网页爬行。他们总是在奔跑,永远不应该停止。然而,大约一周后,他们系统性地“冻结”:不再有输出,对Ctrl+C或任何东西都没有响应。唯一的方法是终止进程并重新启动它 我怀疑这些问题来自于我用来检索数据的库(urllib2),但这个问题很难重现 因此,我想知道如何检查进程的状态,并在进程冻结时自动终止/重新启动它。我想创建一个PID文件,并定期更新它。然后,另一个脚本可以定期检查此PID文件的最后修改日期,如果该文件太旧,则重新启动该进程。我可以用类似的东西来监控 我应该这

我有几个脚本,我用来做一些网页爬行。他们总是在奔跑,永远不应该停止。然而,大约一周后,他们系统性地“冻结”:不再有输出,对Ctrl+C或任何东西都没有响应。唯一的方法是
终止
进程并重新启动它

我怀疑这些问题来自于我用来检索数据的库(
urllib2
),但这个问题很难重现

因此,我想知道如何检查进程的状态,并在进程冻结时自动终止/重新启动它。我想创建一个PID文件,并定期更新它。然后,另一个脚本可以定期检查此PID文件的最后修改日期,如果该文件太旧,则重新启动该进程。我可以用类似的东西来监控


我应该这样做吗?是否有另一种最佳实践/常用方法来检查进程的响应性?

如果您有一个始终在运行的进程,没有连接的终端,并且是进程组组长,即守护进程。毫无疑问,你知道这一切

在编写这样的程序时有一些实际的做法。一种是有一个信号处理程序,它接收信号并强制程序重新初始化自身。这意味着关闭所有打开的日志文件,重新读取配置脚本,等等。我不知道这对您的问题有多适用,但它有时可以解决我工作中冻结的守护进程之类的问题

您可以通过使用
SIGUSR1
SIGUSR2
信号来执行特殊操作,如向文件写入状态或其他任何操作,从而自定义此想法。由于信号是在中断时传入的,因此python中脚本和信号处理程序中的trap语句本身将把程序状态推到中断堆栈上并执行“填充”。
在您的情况下,您可能需要程序fork/exec本身,然后杀死父级

本着只做最简单的事情的精神,你不能有一个shell脚本,永远调用你的Python脚本,并且Python脚本在'n'爬行后完成。它可能无法解决潜在的问题,但可能允许您在分析爬网数据上花费更多的精力。我同意,这类事情会起作用,如果我不能很快找到好的解决方案,我会这么做。但是我觉得我可以做得更好。我不太确定,但我认为这些过程的状态是“D”(manps)。你不能做一个cron来检查给定的进程是否有状态D吗?很好。下次发生这种情况时,我会检查状态。如果是这样的话,那么你的解决方案会起作用。我想知道当进程冻结时,你的爬网处于什么状态?它处理了1200个链接中的525个,然后在重新启动时,你必须清除这些525个链接并重新启动该站点的爬网;我想你也会想尝试做一些类似的事情,这样你就可以知道它卡在哪里了。