subprocess.check_output(..) 进程在 运行 循环时返回相同的输出
subprocess.check_output(..) process returning the same output when run in loop
我是python的新手。所以请多多包涵 :)
我想编写一个脚本来检查系统的 CPU 利用率,如果它超过阈值,它应该与其他细节一起进行线程转储。
我在 python 中编写了一个脚本,如下所示,并使用 "vmstat" 命令查看用户周期和系统周期。
如果这 2 个加起来超过阈值,我将进行线程转储。
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" 过程一次。
我们能否以某种方式使它每次都能 运行?
您的 Python 没问题,除了 else
后缺少分号。
要查看出现了什么问题,首先要确保系统将繁忙。在其他终端 window 中启动 cpu 密集型命令,例如:
yes | wc -c
如果您没有备用终端 window,请像这样在后台启动它:
yes | wc -c &
当那个命令是运行ning时,执行vmstat 1 5
可以看到系统正在使用CPU.
现在 运行 您的程序告诉 Python 执行的命令:
vmstat|tail -1
多做几次。这将告诉您为什么您的程序总是显示相同的数字。这是因为没有参数的 vmstat
总是显示相同的数字。
嗯,从技术上讲这并不完全正确,它并不总是显示相同的值。这些值会随着时间慢慢改变。真正发生的事情是这样的(从 vmstat
手册页复制):
vmstat
reports information about processes, memory, paging, block IO, traps, disks and cpu activity.
The first report produced gives averages since the last reboot.
如果您的系统已经运行了一段时间,那么将需要很多时间 activity 才能更改第一行显示的平均值。
要修复,请将您的 Python 程序更改为 运行 vmstat 1 2|tail -1
。 (运行 你自己几次检查它是否显示了你想要它显示的内容。)显然,积累和发出最新数据需要一秒钟,但为了这个程序的目的这可能是可以接受的。根据您希望监控的敏感程度,您甚至可能想要告诉 vmstat
在更长的时间内进行采样。
不要忘记杀死 运行 在后台或其他终端中运行的 CPU-waster。
我是python的新手。所以请多多包涵 :)
我想编写一个脚本来检查系统的 CPU 利用率,如果它超过阈值,它应该与其他细节一起进行线程转储。 我在 python 中编写了一个脚本,如下所示,并使用 "vmstat" 命令查看用户周期和系统周期。 如果这 2 个加起来超过阈值,我将进行线程转储。
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" 过程一次。 我们能否以某种方式使它每次都能 运行?
您的 Python 没问题,除了 else
后缺少分号。
要查看出现了什么问题,首先要确保系统将繁忙。在其他终端 window 中启动 cpu 密集型命令,例如:
yes | wc -c
如果您没有备用终端 window,请像这样在后台启动它:
yes | wc -c &
当那个命令是运行ning时,执行vmstat 1 5
可以看到系统正在使用CPU.
现在 运行 您的程序告诉 Python 执行的命令:
vmstat|tail -1
多做几次。这将告诉您为什么您的程序总是显示相同的数字。这是因为没有参数的 vmstat
总是显示相同的数字。
嗯,从技术上讲这并不完全正确,它并不总是显示相同的值。这些值会随着时间慢慢改变。真正发生的事情是这样的(从 vmstat
手册页复制):
vmstat
reports information about processes, memory, paging, block IO, traps, disks and cpu activity.The first report produced gives averages since the last reboot.
如果您的系统已经运行了一段时间,那么将需要很多时间 activity 才能更改第一行显示的平均值。
要修复,请将您的 Python 程序更改为 运行 vmstat 1 2|tail -1
。 (运行 你自己几次检查它是否显示了你想要它显示的内容。)显然,积累和发出最新数据需要一秒钟,但为了这个程序的目的这可能是可以接受的。根据您希望监控的敏感程度,您甚至可能想要告诉 vmstat
在更长的时间内进行采样。
不要忘记杀死 运行 在后台或其他终端中运行的 CPU-waster。