基于 CPU 负载问题的条件逻辑

基于 CPU 负载问题的条件逻辑

我正在开发 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 中已经存在很长时间了?

还请记住,该算法(尽管不起作用)可能无法在其他平台上起作用:

/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

...

相关内容