1

我有几个用于进行网络爬取的脚本。它们一直在运行,并且永远不应该停止。然而,大约一周后,它们系统地“冻结”:不再有输出,对 Ctrl+C 或任何东西都没有响应。唯一的方法是kill进程并重新启动它。

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

因此,我想知道如何检查进程的状态并在它被冻结时自动杀死/重新启动它。我正在考虑创建一个 PID 文件,并定期更新它。然后另一个脚本可以定期检查此 PID 文件的最后修改日期,如果它太旧,则重新启动该进程。我可以使用像Monit这样的东西来进行监控。

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

4

1 回答 1

2

如果您有一个始终在运行的进程,没有连接的终端,并且是进程组负责人 - 那就是一个守护进程。你无疑知道这一切。

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

SIGUSR1你可以通过使用和信号来定制这个想法SIGUSR2来做一些特殊的事情,比如将状态写入文件,或者其他任何事情。由于信号在中断时进入,脚本中的陷阱语句和 python 本身的信号处理程序会将程序状态推送到中断堆栈并执行“工作”。在您的情况下,您可能需要程序 fork/exec 本身,然后杀死父级。

于 2013-02-26T23:41:21.017 回答