我正在os.system(cmd)
for 循环中运行。由于有时它会挂起,因此我尝试process=subprocess.pOpen(cmd)
在 for 循环中使用。但我想知道以下内容:
如果我这样做
sleep(60)
然后使用检查进程是否仍在运行process.poll()
,我如何区分即使在 1 分钟后实际运行的进程和挂起的进程?如果我杀死挂起的进程,for循环会继续还是会退出?
谢谢!
我正在os.system(cmd)
for 循环中运行。由于有时它会挂起,因此我尝试process=subprocess.pOpen(cmd)
在 for 循环中使用。但我想知道以下内容:
如果我这样做sleep(60)
然后使用检查进程是否仍在运行process.poll()
,我如何区分即使在 1 分钟后实际运行的进程和挂起的进程?
如果我杀死挂起的进程,for循环会继续还是会退出?
谢谢!
我不知道有什么通用方法可以判断一个进程是挂起还是工作。如果某个进程由于锁定问题而挂起,那么它可能会消耗 0% 的 CPU,您可能会猜到它已挂起并且无法工作;但如果它以无限循环挂起,则该进程可能会使 CPU 100% 忙碌但无法完成任何有用的工作。你可能有一个在网络上通信的进程,它与一个非常慢且超时时间很长的主机通信;不会挂起,但在等待时会消耗 0% 的 CPU。
我认为,总的来说,您唯一的希望是建立某种“看门狗”系统,您的子进程使用进程间通信定期发送一个意味着“我还活着”的信号。
如果你不能修改你作为子进程运行的程序,那么至少试着找出它挂起的原因,然后看看你是否能找到一种方法来猜测它已经挂起。也许它通常具有 CPU 和 I/O 的平衡组合,但是当它挂起时,它会进入一个紧密的无限循环,并且 CPU 使用率会达到 100%;那将是您的线索,是时候杀死它并重新启动了。或者,它可能每 30 秒写入一个日志文件,您可以监控文件的大小并在文件没有增长时重新启动它。或者,也许您可以将程序置于“详细”模式,在它工作时打印消息(stdout
要么stderr
) 你可以看那些。或者,如果程序作为守护进程工作,也许你可以主动查询它,看看它是否还活着;例如,如果是数据库,发送一个简单的查询,看看是否成功。
所以我不能给你一个笼统的答案,但我希望你应该能够找到一种方法来检测你的特定程序何时挂起。
最后,最好的解决方案是找出它挂起的原因,并解决问题,使其不再发生。这可能是不可能的,但至少要记住这一点。如果程序不再挂起,您就不需要检测程序挂起!
PS 我建议您在 Google 上搜索“如何监控流程”,看看您是否从中得到任何有用的想法。
检测已停止工作的事物的一种常见方法是让它们以大致固定的时间间隔发出一个信号,并让另一个进程监视该信号。如果监视器在两次间隔之后发现没有信号到达,它可以采取诸如终止和重新启动进程之类的操作。
这个总体思路不仅可以用于软件,也可以用于硬件。我用它通过简单地从输出位的交流耦合信号为电容器充电来重新启动嵌入式控制器。一个简单的检测器监控电容器,如果电压低于阈值,它只会将复位线拉低,同时保持电容器充电足够长的时间以使控制器重新启动。
软件原理类似;一种方法是让进程每隔一段时间简单地触摸一个文件。监视器每隔一段时间检查文件修改时间,如果它太旧,则终止并重新启动该过程。
在 OP 的情况下,子进程可以将状态代码写入文件,以说明它在工作中的进展情况。