Получить информацию о процессоре и памяти на разных серверах HPUX unix

Я пытаюсь создать сценарий bash для получения информации о ЦП и памяти на разных серверах Unix и передачи их в один текстовый файл на локальном сервере.

Сценарий что-то возвращает (результат), но результат был неточным, когда я вручную проверял информацию о ЦП и памяти каждого из серверов. В скриптах может быть какая-то ошибка, так как команды CPU и Memory верны.

Вот команда для получения информации о процессоре в Unix (HPUX):

machinfo | grep CPUs | awk '{print $5}'

И результатом будет:

4

А вот команда для получения информации о памяти в Unix (HPUX):

machinfo | grep Memory | awk '{print $3}'

И результатом будет:

4090

Это показывает, что команды верны. Перейдем к полным сценариям.

#!/bin/ksh

SERVERS='
xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx'


cpu=$(machinfo | grep CPUs | awk '{print $5}')
mem=$(machinfo | grep Memory | awk '{print $3}')

print "SERVER" "CPU" "RAM (MB)";

for i in $SERVERS
do
  ssh -n $i 2>&1 '$cpu | $mem'
  print $cpu $mem
done

Когда запустятся полные скрипты, результатом будет:

SERVER CPU RAM (MB)
s24bf011 2 4090
s24bf012 2 4090
s24bf013 2 4090
s24bf014 2 4090
s24bf016 2 4090
S24BF104 2 4090
S24BF105 2 4090
10.14.24.158 2 4090
S29BF200 2 4090
S02BF131 2 4090
S02BF104 2 4090
S24BF071 2 4090
S24BF165 2 4090
10.14.24.17 2 4090

Каждый сервер имеет свой процессор и оперативную память. Почему они все одинаковые? Ошибка в SSH?


person the Killerx    schedule 02.04.2015    source источник
comment
$(foo) тут же выполняет foo. Вы ничего не запускаете на своих удаленных серверах.   -  person Mat    schedule 02.04.2015


Ответы (1)


Ваш сценарий имеет несколько проблем.

'$cpu | $mem'

это просто буквальная строка. Если вы хотите интерполировать значения $cpu и $mem, вам нужно использовать двойные кавычки вместо одинарных.

Но

"$cpu | $mem"

в основном отбрасывает вывод из $cpu, потому что вы передаете его в $mem, который игнорирует его стандартный ввод. Правильный способ запуска двух независимых команд — поставить между ними точку с запятой, а не вертикальную черту. Функция канала состоит в том, чтобы брать стандартный вывод команды перед каналом и перенаправлять его в качестве стандартного ввода в команду после канала.

Но, разумеется, объявленные вами переменные не содержат скриптов; они содержат выходные данные сценариев Awk, которые вы запускали локально, когда помещали их в подстановки процессов.

Вы должны были получать сообщения об ошибках обо всем этом; что с ними случилось?

В любом случае, вы можете значительно упростить обработку, реорганизовав это так, чтобы в любом случае запускалась одна команда.

print "SERVER" "CPU" "RAM (MB)";

for i in $SERVERS
do
  ssh -n "$i" "machinfo |
    awk -v s='$i' '/CPUs/ { c=\$5 } /Memory/ { m=\$3 }
        END { print s, c, m }'"
done

Здесь я использую двойные кавычки вокруг удаленной команды, чтобы я мог интерполировать имя сервера в переменную Awk s. Внутренние одинарные кавычки внутри двойных кавычек не имеют никакого значения для локальной оболочки, т. е. они не препятствуют тому, чтобы локальная оболочка заменяла знаки доллара, поэтому нам нужно защитить знаки доллара, экранируя их обратной косой чертой.

Но если ваш локальный Awk не поврежден или что-то в этом роде, нет смысла запускать Awk удаленно.

for i in $SERVERS
do
  ssh -n "$i" machinfo |
    awk -v s="$i" '/CPUs/ { c=$5 } /Memory/ { m=$3 }
        END { print s, c, m }'
done

Помещать в переменную вещи, которые не являются переменными и которые используются только один раз, просто глупо, а иногда и проблематично (см. http://mywiki.wooledge.org/BashFAQ/050).

person tripleee    schedule 02.04.2015