Bash 中的浮点数运算,第 2 部分(等待系统负载)

作者: Mitch Frazier

如果您运行的脚本需要大量的执行时间,最好尽量避免让它们使您的系统过载。 您可以通过以下方式运行它们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以便可以从其他脚本调用它。

该命令需要三个命令行参数

  • 暂停的平均负载,作为一个浮点值
  • 重新启动的平均负载,作为一个浮点值
  • 暂停的时间(以秒为单位),介于负载检查之间
当它暂停时,每次从暂停中醒来时都会打印一个句点,并且每 10 次打印一次负载。

脚本的源代码如下

#!/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...
  $

Mitch Frazier 是艾默生电气公司的嵌入式系统程序员。 自 2000 年代初以来,Mitch 一直是Linux Journal 的贡献者和朋友。

加载 Disqus 评论