python - 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”进程。我们能以某种方式让它每次都运行吗?
解决方案
你的 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 浪费。
推荐阅读
- r - 将颜色酿造器应用于 ggplot 中的单行
- r - R - 按组计算滞后变量
- api - ActiveMQ Artemis 使用 API 调用浏览方法
- html - 是否可以在 twig Symfony 4 中将 CSS 类添加到 form_row?
- excel - 重命名过滤器值
- python - 如何在熊猫数据框中删除具有特定名称的多行
- react-native - React-Native-Navigation (v2) 底部选项卡 onPress
- azure-devops - 如何在 Azure Devops 和 Microsoft Teams 之间共享成员资格?
- java - 如何分隔接收到的字节
- python - 我如何从具有下一步按钮的网站以及是否滚动的网站中抓取?