Não é necessário fazer cálculos usando bc
, você pode usar
mem1=$(ssh ${arr[0]} "free -m | awk 'END{if(NR==2) print \*100/\ }'")
mem2=$(ssh ${arr[1]} "free -m | awk 'END{if(NR==2) print \*100/\ }'")
Eu basicamente obtenho o uso de memória de dois nós diferentes via ssh e armazeno isso em duas variáveis diferentes. Em seguida, seleciono o host com menos memória e retorno um código 0 ou 1. O array arr contém dois nomes de host.
function selectNode() {
arr=("$@")
mem1=$((ssh ${arr[0]} "free -m | awk 'NR==2{print \"%f\n\", \*100/\ }'")| bc -l)
mem2=$((ssh ${arr[1]} "free -m | awk 'NR==2{print \"%f\n\", \*100/\ }'")| bc -l)
if [ "${mem1}" > "${mem2}" ]; then
node=1
else
node=0
fi
return $node
}
O script acima é executado corretamente e retorna 0 ou 1, mas eu recebo um erro de sintaxe na linha mem1 e mem2.
(standard_in) 1: syntax error
Qual é a correção aqui?
Não é necessário fazer cálculos usando bc
, você pode usar
mem1=$(ssh ${arr[0]} "free -m | awk 'END{if(NR==2) print \*100/\ }'")
mem2=$(ssh ${arr[1]} "free -m | awk 'END{if(NR==2) print \*100/\ }'")
Você só precisa executar o comando free
nos servidores:
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
}
Aqui, apenas o comando free
é executado nos servidores, enquanto awk
está sendo executado localmente. Além disso, permitimos que awk
converta o resultado do cálculo para um inteiro, para que possamos usá-lo com o teste -lt
mais tarde.
Você usaria isso como
server=$( selectNode "user@server1" "user@server2" )
Alternativamente:
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" ]
}
e depois
if selectNode "user@server1" "user@server2"; then
server="user@server1"
else
server="user@server2"
fi
Tags ssh bc awk linux shell-script