获取不同HPUX unix服务器中的CPU和内存信息

时间:2015-04-02 04:56:17

标签: linux bash unix hp-ux

我正在尝试创建一个bash脚本,以便在不同的Unix服务器中获取CPU和内存信息,并将它们传输到本地服务器中的单个文本文件中。

脚本返回一些内容(结果),但是当我手动检查每个服务器CPU和内存信息时结果不准确。由于CPU和内存命令正确,因此脚本中可能存在一些错误。

以下是在Unix中获取CPU信息的命令(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

每台服务器都有不同的CPU和RAM。他们怎么都一样? SSH服务出错?

1 个答案:

答案 0 :(得分:0)

您的脚本存在多个问题。

'$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中。双引号内的单引号对本地shell没有任何意义,即它们不会阻止本地shell替换美元符号,因此我们需要通过反斜杠来保护美元符号。

但除非您的本地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)。