当我在 bc 上使用 ssh 和 awk 时出现语法错误

当我在 bc 上使用 ssh 和 awk 时出现语法错误

我基本上通过 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

相关内容