首页 > 解决方案 > subprocess.check_output(..) 进程在循环中运行时返回相同的输出

问题描述

我是python的新手。所以请多多包涵:)

我想编写一个脚本来检查系统的 CPU 利用率,如果超过阈值,它应该进行线程转储以及其他详细信息。我在 python 中编写了如下脚本,并使用“vmstat”命令查看用户周期和系统周期。如果这两个组合超过阈值,我将进行线程转储。

while True:
    output = subprocess.check_output("vmstat|tail -1", shell=True).decode('utf-8');
    m = re.search(r"(\d+)\s+(\d+)\s+(\d+)\s+\d+\s+\d+$", output)
    print('US', int(m.group(1)))
    print('SY', int(m.group(2)))
    # us: Time spent running non-kernel code. (user time, including nice time)
    # sy: Time spent running kernel code. (system time)
    usage=int(m.group(1))+int(m.group(2))
    if usage>CPU:
        ...
    else
        print "cpu usage is below threshold"

但问题是我得到相同的值

US 1
SY 0
cpu usage is below threshold
US 1
SY 0
cpu usage is below threshold
US 1
SY 0
cpu usage is below threshold
US 1
SY 0
cpu usage is below threshold

同时,如果我在不同的控制台中运行“vmstat”命令,那么我可以看到“US”和“SY”参数的不同值 - 在此处输入图像描述

我认为 subprocess.check_output(..) 只运行一次“vmstat”进程。我们能以某种方式让它每次都运行吗?

标签: pythonsubprocesscpu-usage

解决方案


你的 Python 没问题,除了else.

要查看发生了什么问题,首先要确保系统将处于忙碌状态。在其他一些终端窗口中启动一个 CPU 密集型命令,例如:

  yes | wc -c

如果您没有备用终端窗口,请在后台启动它,如下所示:

  yes | wc -c &

在该命令运行时,执行vmstat 1 5并查看它显示系统正在使用 CPU。

现在运行程序告诉 Python 执行的命令:

  vmstat|tail -1

这样做几次。这将告诉您为什么您的程序总是显示相同的数字。这是因为vmstat没有参数总是显示相同的数字。

好吧,从技术上讲,这并不完全正确,它并不总是显示相同的值。这些值会随着时间慢慢改变。真正发生的是(从vmstat手册页复制):

vmstat 报告有关进程、内存、分页、块 IO、陷阱、磁盘和 cpu 活动的信息。

生成的第一个报告给出了自上次重新启动以来的平均值。

如果您的系统已经运行了一段时间,那么将需要大量活动来更改第一行显示的平均值。

要解决此问题,请将您的 Python 程序更改为运行vmstat 1 2|tail -1. (自己运行几次以检查它是否显示了您希望它显示的内容。)显然,累积和发出最新数据需要一秒钟,但对于该程序而言,这可能是可以接受的。根据您希望监控的敏感程度,您甚至可能希望vmstat在更长的时间内进行采样。

不要忘记杀死在后台或其他终端中运行的 CPU 浪费。


推荐阅读