Erro de sintaxe quando eu uso ssh com awk over bc

0

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?

    
por Kiran Kumar 18.06.2018 / 12:36

2 respostas

0

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/\ }'")
    
por 18.06.2018 / 12:54
0

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
    
por 19.06.2018 / 09:06