我正在尝试创建一个bash脚本来获取不同Unix服务器中的CPU和内存信息,并将它们通过管道传输到本地服务器中的单个文本文件中。
脚本返回一些东西(结果),但是当我手动检查每个服务器的CPU和内存信息时,结果并不准确。脚本中可能存在一些错误,因为CPU和内存命令是正确的。
下面是在Unix (HPUX)中获取CPU信息的命令:
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。为什么他们都是一样的?是否在SSHing中出错?
发布于 2015-04-02 13:42:37
您的脚本有多个问题。
'$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)。
https://stackoverflow.com/questions/29405227
复制相似问题