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

관련 정보