我正在尝试构建一个脚本,以在平均负载达到特定阈值时触发 Linux 设备的操作/警报。
脚本如下所示:
!/bin/bash
load=`echo $(cat /proc/loadavg | awk '{print $2}')`
if [ "$load" -gt 5 ]; then
echo "foo alert!"
fi
echo "System Load $(cat /proc/loadavg)"
归功于helloacm.com让我从这里开始。
当我运行它时,我收到一个错误:
./foocheck.sh: line 4: [: 0.03: integer expression expected
这是有道理的——它看到了句点/小数并认为我正在将字符串与整数进行比较。
我为此找到的大多数解决方案都涉及bc -l
该设备上不可用的解决方案。我需要找到一种方法来比较这些值而不使用bc
.有任何想法吗?
答案1
只能使用整数部分进行比较:
load=$(awk '{print $2}' /proc/loadavg | cut -d. -f1)
答案2
由于您有 awk 可用并且 awk 可以处理浮点值,请执行以下操作:
awk '($1>5){print("yes")}'
编辑后的脚本:
#!/bin/bash
load=`echo $(cat /proc/loadavg | awk '{print $2}')`
loadtest=$(echo "$load" | awk '($1>5){print("yes")}')
if [ "$loadtest" = yes ]; then
echo "foo alert!"
fi
当然,仅使用 awk 可以进一步简化整个脚本。
或许:
#!/bin/bash
awk '($2>5){print("foo alert!")}' /proc/loadavg
答案3
set -- $(cat /proc/loadavg)
load=${2/./}
if [ "$load" -ge 500 ]; then
echo alert
fi
从 /proc 获取负载平均值,并根据这些字段设置位置参数。抓住第二个字段并去掉句点。如果该值(现在是数字)大于或等于 500,则发出警报。这假设(当前)负载平均值显示为小数点后两位。谢谢箭指出更好的方法。
答案4
bash
不能做浮点。使用zsh
,ksh93
或yash
代替:
#! /bin/zsh -
read ignore load ignore < /proc/loadavg || exit
if ((load > 5)); then
echo >&2 Alert
fi
或者因为您已经在使用awk
(以及一些不必要的命令):
#! /bin/sh -
awk '$2 > 5 {print "Alert"}' < /proc/loadavg >&2
或者,如果您在sh
if
构造中需要它:
#! /bin/sh -
if awk '{exit !($2 > 5)}' < /proc/loadavg; then
echo >&2 Alert
fi