我正在尝试制作一个基于负载对机器进行排序的程序,但是我很难解析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,我真的需要帮助。
答案 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分钟的平均值。