기본적으로 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