Intereting Posts
Настройка серверов имен в CentOS 6 Как изменить формат даты на экране LXDM для входа / приветствия (LXDE) Почему SIGINT не работает в фоновом режиме в скрипте? Как ifconfg извлекает включенные сетевые карты? Centos внутри Virtualbox – как установить пользовательское разрешение? Как изменить каталог установки образа Docker? Кронтаб с Гитубом Перенаправление вывода GREP в разные текстовые файлы в зависимости от содержимого захвата Как анализировать данные профиля из `perf record -a` (общесистемная коллекция)? Charset / font в консоли Linux Как я могу увидеть, когда мой компьютер был перезагружен? Есть ли патч ядра для предотвращения загрузки файлов в RAM для LiveCD? Службы в /etc/rc.local препятствуют завершению системы для загрузки изменять текстовый файл только с одним номером, подлежащим ограничениям Лучшая практика резервного копирования зашифрованного устройства LUKS

Синтаксическая ошибка, когда я использую SSH с AWK над BC

Я в основном получаю использование памяти от двух разных узлов через 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 

Что здесь исправить?

Нет необходимости делать расчеты с помощью 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 }'") 

Вам нужно только запустить команду 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