我试图在 CPU 使用率低于 80% 时每 10 分钟运行一次命令。我不习惯 bash 脚本。我找到了一种方法来获取 CPU 的总使用量``top -b -n1 | grep“CPU”| awk '{print $2 + $4}'` 然后我想与最大值 80% 进行比较。但我不知道为什么我不能比较两者。这里是脚本:
#!/bin/bash
MAX=80
CPU=`top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}'`
while true
do
if $CPU < $MAX
then
echo $CPU # This is an example
CPU=`top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}'`
sleep 10m
fi
done
脚本失败,因为将数字解释为命令... ( cannot open 80: No such file
) 为什么我无法编译$MAX
and $CPU
?你会如何解决这个问题?
提前致谢。
答案1
<
是用来
重定向。如果需要比较整数:
if [ "$MAX" -gt "$CPU" ]
但$CPU
也可以是浮点数,bash 不能直接对浮点数进行操作,所以你必须使用bc
:
if [ "$(bc -l <<< "${CPU} > ${MAX}")" -eq 1 ]
您还应该使用$(..)
表单而不是遗留反引号并且您只能CPU
在 while 循环内分配一次:
#!/bin/bash
MAX=80
while true
do
CPU="$(top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}')"
if [ "$(bc -l <<< "${CPU} > ${MAX}")" -eq 1 ]
then
echo "$CPU" # This is an example
sleep 10m
fi
done
答案2
top(1)
不是解决这个问题的最好方法。这是一个相当重量级的测量工具,扫描的内容远远超出您的需要。此外,它关注的是瞬时值,这在这里是不正确的。
相反,你应该使用系统平均负载因为它们是在内核中长时间连续计算的。这意味着它们不会产生额外费用,因此不会影响您的测量,并且它们不会受到瞬时变化的影响......例如呼叫top(1)
!
这是根据平均负载重写的脚本:
#!/bin/bash
HIGH_LOAD=6 # 80% of an 8-core system; see link above
while true
do
CURR_LOAD=$(cut -f2 -d' ' < /proc/loadavg)
if [ $CURR_LOAD -lt $HIGH_LOAD ]
then
run-background-command
fi
sleep 10m
done
请注意,sleep
呼叫已移至if
条件之外:无论如何您都想延迟。也许您想添加一个else
替代项,以便低负载情况和高负载情况下的延迟不同。
与您的版本不同的是,我们不会在循环内部和外部重复 CPU 使用情况检查。