【问题标题】:bash: generate machine list based on loadbash:根据负载生成机器列表
【发布时间】:2014-01-23 05:36:21
【问题描述】:

我正在尝试制作一个根据负载对机器进行排序的程序,但我很难解析 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,因此我真的需要帮助。

【问题讨论】:

  • 将一些示例输入发布到第一个 awk 命令(即 ssh 循环的输出)以及给定该输入的该 awk 命令的预期输出,并解释原因。如果您也需要帮助,请对您的第二个 awk 脚本执行相同操作。
  • 添加了示例输入和输出。
  • 在我看来不像。请记住 - 我们需要从每个 awk 脚本的角度输入和输出,因为这就是您要求我们帮助您编写的内容。想想您的 awk 脚本将什么视为输入,而不是整个脚本的总体目标。

标签: performance bash ssh awk load


【解决方案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
}

【讨论】:

    【解决方案2】:

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

    这是一个完全替换您的脚本的版本,它以 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 分钟的平均值。

    【讨论】:

    • 我最终做到了。我仍然想知道用 awk 来做这件事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多