2012-07-11 166 views
2

我在for循环中运行os.system(cmd)。由于它有时会挂起,所以我试图在for循环中使用process=subprocess.pOpen(cmd)。但我想了解以下内容:python处理子进程

  • 如果我做sleep(60),然后检查进程仍在使用process.poll()运行,我怎么连1分钟后和工艺挂在实际运行过程中区分?

  • 如果我杀死挂起的进程,for循环会继续还是会退出?

谢谢!

回答

4

我不知道任何通用的方法来判断一个进程是否挂起或正在工作。如果一个进程由于锁定问题而挂起,那么它可能会消耗0%的CPU,并且您可能会猜测它已挂起而不工作;但是如果它以无限循环挂起,则该过程可能使CPU百分百繁忙,但不能完成任何有用的工作。你可能有一个进程在网络上进行通信,与一个超长超时的非常慢的主机通话;那将不会被挂起,但会在等待时消耗0%的CPU。

我认为,一般来说,唯一的希望是建立某种“看门狗”系统,其中您的子过程使用进程间通信定期发送一个信号,意思是“我还在活”。

如果您不能修改正在运行的子进程的程序,那么至少揣摩为什么它挂起,看看你就可以想出一个办法去猜测它已经挂。也许它通常具有CPU和I/O的平衡组合,但是当它挂起时,它会进入一个紧密的无限循环,并且CPU使用率会达到100%;那是你的线索,现在是时候杀死它并重新启动。或者,也许它每隔30秒写入一个日志文件,并且可以监视文件的大小,并在文件不增长时重新启动它。或者,也许你可以把程序放在一个“详细”模式中,在它打印消息的时候(或者到stdout或者stderr),你可以看这些。或者,如果程序作为守护进程工作,也许你可以主动查询它并查看它是否存在;例如,如果它是一个数据库,发送一个简单的查询并查看它是否成功。

所以我不能给你一个一般的答案,但我有一些希望你应该能够找出一种方法来检测你的特定程序挂起。

最后,最好的解决方案是弄清楚它为什么会挂起,并解决问题,这样它就不会再发生了。这可能是不可能的,但至少要牢记在心。如果程序不再挂起,则不需要检测挂起的程序!

P.S.我建议你做一个谷歌搜索“如何监控一个过程”,看看你是否从中得到任何有用的想法。

0

检测已停止工作的常用方法是让它们以大致固定的时间间隔发出信号,并让另一个进程监视信号。如果监视器发现没有信号到达,比如两倍的时间间隔,它可以采取行动,例如查杀并重新启动进程。

这个一般的想法不仅可以用于软件,也可以用于硬件。我已经用它来重新启动嵌入式控制器,只需向a.c充电一个电容。来自输出位的耦合信号。一个简单的检测器监控电容器,并且如果电压低于某个阈值,则只需将复位线拉低,同时将电容器充电足够长时间以使控制器重新启动。

软件的原理是相似的;一种方法是让程序间隔地简单地触摸一个文件。监视器会每隔一段时间检查一次文件修改时间,如果过早杀死并重新启动该进程。

在OP的情况下,子进程可以写一个状态码给一个文件来说明它在工作中有多远。