python 处理子进程

标签 python for-loop subprocess

我正在 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 秒写入一个日志文件,您可以监视文件的大小,如果文件没有增长,则重新启动它。或者,也许您可​​以将程序置于“详细”模式,在其工作时打印消息(打印到 stdoutstderr),您可以观看这些消息。或者,如果该程序作为守护进程运行,也许您可​​以主动查询它并查看它是否还活着;例如,如果是数据库,则发送一个简单的查询,看看是否成功。

所以我无法给您一个一般性的答案,但我希望您能够找到一种方法来检测特定程序何时挂起。

最后,最好的解决方案是找出它挂起的原因,并解决问题,这样它就不会再发生了。这也许不可能,但至少记住这一点。如果程序不再挂起,则无需检测程序挂起!

附注我建议您在 Google 上搜索“如何监控进程”,看看是否能从中得到任何有用的想法。

关于python 处理子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11442944/

相关文章:

python - 不可散列类型列表 python

python - 在 Python 中连接两个 32 位 int 以获得 64 位长

python - 计算旋转矩阵以在3D空间中对齐两个向量?

java - For 循环和 if 语句的行为很奇怪

javascript - 使用 for 循环检查用户是否输入一周或周末

python - 为什么 subprocess.Popen 的输出与预期的不一样?

Python 动态子集的高效查找结构?

python - 为什么缓冲来自子进程的标准输出(重定向到无缓冲文件)?

python - 如何将数据从 Python 异步套接字服务器发送到子进程?

c++ - 在基于范围的 for 循环中使用转发引用有什么好处?