我正在开发 bash 脚本,用于启用/禁用 cloudflare 的 ddos 保护。这是我的代码:
#!/bin/bash
PERC=$(grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage}');
if [[ "$PERC" -gt 50 ]]
then
echo 'high load';
else
echo 'normal load';
fi
我有 2 个问题:1. PERC 的结果总是一样的 2. 似乎 PERC 变量的结果不正确,因为错误 '-bash: [[: 41.8679: 语法错误: 无效的算术运算符(错误标记为“.8679”)'
我的代码有什么问题?
答案1
使用时间点 CPU 负载可能会导致非常具有误导性的结果 - 比如你恰好在刷新缓存的过程中捕获到它,而这占用了 0.2 秒的 100% CPU...
此外,bash
它只能处理整数运算。您可以使用类似工具bc
来执行更复杂的运算。或者,考虑到您可能不关心小数值,您可以将其去掉(cut -d. -f 1
)
您是否考虑过使用长期存在的平均负载这个概念在 UNIX 中已经存在很长时间了?
- https://superuser.com/questions/23498/what-does-load-average-mean-on-unix-linux
- https://www.howtogeek.com/194642/understanding-the-load-average-on-linux-and-other-unix-like-systems/
还请记住,该算法(尽管不起作用)可能无法在其他平台上起作用:
/proc/stat 内核/系统统计信息。随架构而异。常见条目包括:
cpu 3357 0 4313 1362393 The amount of time, measured in units of USER_HZ (1/100ths of a second on most architectures, use sysconf(_SC_CLK_TCK) to obtain the right value), that the system spent in various states
...