我基本上通过 ssh 从两个不同的节点获取内存使用情况,并将其存储在两个不同的变量中。然后,我选择内存较小的主机并返回代码 0 或 1。数组 arr 包含两个主机名。
function selectNode() {
arr=("$@")
mem1=$((ssh ${arr[0]} "free -m | awk 'NR==2{print \"%f\n\", \$3*100/\$2 }'")| bc -l)
mem2=$((ssh ${arr[1]} "free -m | awk 'NR==2{print \"%f\n\", \$3*100/\$2 }'")| bc -l)
if [ "${mem1}" > "${mem2}" ]; then
node=1
else
node=0
fi
return $node
}
上面的脚本运行正常并返回 0 或 1,但我在 mem1 和 mem2 行收到语法错误。
(standard_in) 1: syntax error
这里的修复是什么?
答案1
无需使用 进行计算bc
,您可以使用
mem1=$(ssh ${arr[0]} "free -m | awk 'END{if(NR==2) print \$3*100/\$2 }'")
mem2=$(ssh ${arr[1]} "free -m | awk 'END{if(NR==2) print \$3*100/\$2 }'")
答案2
您只需要free
在服务器上运行命令:
selectNode () {
mem1=$( ssh "$1" free | awk '/^Mem:/ { print int(100*$3/$2) }' )
mem2=$( ssh "$2" free | awk '/^Mem:/ { print int(100*$3/$2) }' )
if [ "$mem1" -lt "$mem2" ]; then
printf '%s\n' "$1"
else
printf '%s\n' "$2"
fi
}
这里,在本地运行free
时仅在服务器上执行命令。awk
另外,我们将awk
计算结果转换为整数,以便-lt
稍后测试时使用。
你可以用它作为
server=$( selectNode "user@server1" "user@server2" )
或者:
selectNode () {
mem1=$( ssh "$1" free | awk '/^Mem:/ { print int(100*$3/$2) }' )
mem2=$( ssh "$2" free | awk '/^Mem:/ { print int(100*$3/$2) }' )
[ "$mem1" -lt "$mem2" ]
}
进而
if selectNode "user@server1" "user@server2"; then
server="user@server1"
else
server="user@server2"
fi