我正在尝试创建一个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服务出错?
答案 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)。