Bash 中的浮点数运算,第 2 部分(等待系统负载)
发表于 2008 年 8 月 11 日
如果您运行的脚本需要大量的执行时间,最好尽量避免让它们使您的系统过载。 您可以通过以下方式运行它们nice,但例如,如果您的脚本正在发送一堆电子邮件,而您的电子邮件守护程序不是通过以下方式运行的nice,它本身可能会失控。 处理这个问题的一种方法是使用以下值/proc/loadavg当您的系统负载过高时暂停。
的内容/proc/loadavg看起来像这样
$ cat /proc/loadavg 0.05 0.14 0.09 1/243 12667前三个数字是过去 1、5 和 15 分钟的平均负载。平均负载是衡量系统繁忙程度的指标,平均负载越高,系统越繁忙。 具体来说,平均负载是系统运行队列中的进程数在一段时间内的平均值,这里是 1、5 或 15 分钟。
您会注意到的一个小小的问题是,平均负载值是浮点值。 这就是我写的bash 的浮点函数发挥作用的地方。
要等待负载,我们只需要从/proc/loadavg提取相关值,然后使用float_cond在我之前提到的帖子中描述的函数,以检查负载是否高于某个点,如果是,则暂停。 我们将把所有这些打包到它自己的文件wait-for-load.sh以便可以从其他脚本调用它。
该命令需要三个命令行参数
- 暂停的平均负载,作为一个浮点值
- 重新启动的平均负载,作为一个浮点值
- 暂停的时间(以秒为单位),介于负载检查之间
脚本的源代码如下
#!/bin/bash
source float.sh
if [[ $# -ne 3 ]]; then
echo "Usage: $0 STOP-AT-LOAD RESTART-AT-LOAD PAUSE-SECONDS"
exit 1
fi
stop_at=$1
restart_at=$2
pause_seconds=$3
##############################################################
function get_load()
{
local loadavg=$(cat /proc/loadavg | cut -d ' ' -f 1)
echo $loadavg
}
##############################################################
load=$(get_load)
if float_cond "$load >= $stop_at"; then
echo -n "Load is $load, pausing"
n=0
while float_cond "$load >= $restart_at"
do
sleep $pause_seconds
echo -n .
load=$(get_load)
let n++
if [[ $n -eq 10 ]]; then
echo -n $load
n=0
fi
done
echo
fi
# vim: tabstop=4: shiftwidth=4: noexpandtab:
# kate: tab-width 4; indent-width 4; replace-tabs false;
脚本的示例运行如下
$ sh wait-for-load.sh 2.0 1.0 10 Load is 5.06, pausing..........1.49... $