我正在 for 循环中运行 os.system(cmd)
。由于有时它会挂起,我尝试在 for 循环中使用 process=subprocess.pOpen(cmd)
。但我想知道以下内容:
如果我执行
sleep(60)
然后使用process.poll()
检查进程是否仍在运行,我如何区分进程实际上甚至在 1 分钟后仍在运行并且进程挂起?如果我终止挂起的进程,for 循环还会继续还是会退出?
谢谢!
最佳答案
我不知道有什么通用方法可以判断进程是挂起还是正在运行。如果一个进程由于锁定问题而挂起,那么它可能会消耗 0% 的 CPU,并且您可能会猜测它已挂起并且无法工作;但如果它因无限循环而挂起,该进程可能会使 CPU 100% 繁忙,但无法完成任何有用的工作。您可能有一个进程在网络上进行通信,与一个非常慢且超时的主机进行通信;不会被挂起,但在等待时会消耗 0% CPU。
我认为,一般来说,您唯一的希望是建立某种“看门狗”系统,您的子进程使用进程间通信定期发送一个信号,这意味着“我还活着” ”。
如果您无法修改作为子进程运行的程序,那么至少尝试找出它挂起的原因,然后看看您是否可以找到一种猜测的方法它已挂起。也许它通常具有均衡的 CPU 和 I/O 组合,但当它挂起时,它会进入紧密的无限循环,CPU 使用率会达到 100%;这将是你的线索,表明是时候杀死它并重新启动了。或者,它可能每 30 秒写入一个日志文件,您可以监视文件的大小,如果文件没有增长,则重新启动它。或者,也许您可以将程序置于“详细”模式,在其工作时打印消息(打印到 stdout
或 stderr
),您可以观看这些消息。或者,如果该程序作为守护进程运行,也许您可以主动查询它并查看它是否还活着;例如,如果是数据库,则发送一个简单的查询,看看是否成功。
所以我无法给您一个一般性的答案,但我希望您能够找到一种方法来检测特定程序何时挂起。
最后,最好的解决方案是找出它挂起的原因,并解决问题,这样它就不会再发生了。这也许不可能,但至少记住这一点。如果程序不再挂起,则无需检测程序挂起!
附注我建议您在 Google 上搜索“如何监控进程”,看看是否能从中得到任何有用的想法。
关于python 处理子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11442944/