bash:根据负载生成机器列表

时间:2014-01-22 20:13:12

标签: performance bash ssh awk load

我正在尝试制作一个基于负载对机器进行排序的程序,但是我很难解析ssh输出。到目前为止我所拥有的是:

gen_data()
{
    declare -a machines=("machine1" "machine2" "machine3" "machine4" "machine5")
    for i in ${machines[@]}; do
        ssh $i "hostname && uptime"
    done | awk ' BEGIN {cnt=0} \
         { printf("%s, ", $0)
          cnt++
          if(cnt % 3 == 0) {printf("\n") }
         }' > ~/perf_data
}
#function check_data
# check for load averages (fields 6,7,8) which are greater than 7
check_data()
{
       awk -F"," '{ if($6 < 9.0 && $7 < 9.0 && $8 < 9.0) 
                        {print $0 } 
                  }' ~/perf_data

}

这段代码的大部分是检查机器负载的代码的修改版本,如果它太高则通过电子邮件发送给你,但我不能完全打印出机器名称或正确制作perf_data文件。

我想要得到的是机器清单me@machine*.network.com,该程序测试机器的负载,如果它足够低,则打印机器名称:

me@machine1.network.com me@machine5.network.com me@machine10.network.com

这样我就可以将输出传递给另一个将使用这些机器的程序。

由于我是awk中的n00b,我真的需要帮助。

2 个答案:

答案 0 :(得分:1)

而不是:

for i in ${machines[@]}; do
        ssh $i "hostname && uptime"
    done | awk ...

用它来让你的生活更轻松

for m in ${machines[@]}; do
    ssh $i <<'COMMANDS'
        echo "$(hostname):$(uptime)" | awk -F: '{gsub(/,/,"",$NF); print $1, $NF}'
COMMANDS
done > ~/perf_data

然后check_data可以

check_data() {
    awk '$2 < 9 && $3 < 9 && $4 < 9 {print $1} ~/perf_data
}

答案 1 :(得分:1)

您可以编写新脚本,而不是修改此脚本。

这是一个完全替换脚本的版本,它以Linux特定的方式获取平均负载:

for host in machine1 machine2 machine3
do
    ssh "$host" '[ "$(awk "\$1 < 9" /proc/loadavg)" ] && hostname'
done > ~/perf_data

或者,您可以通过正常运行时间来完成:

for host in machine1 machine2 machine3
do
    ssh "$host" '[ "$(uptime | awk -F"[ ,]+" "\$11 < 9")" ] && hostname'
done > ~/perf_data

这两个都假设你对当前的负荷感兴趣,所以它检查1分钟的平均值,而不是关心15分钟的平均值。