subprocess.check_output(..)循环运行时返回相同输出的过程

时间:2018-10-16 13:59:52

标签: python subprocess cpu-usage

我是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”参数的不同值- enter image description here

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

1 个答案:

答案 0 :(得分:3)

您的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浪费。