我正在尝试制作一个 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。他们怎么都一样? SSH 连接出错?
最佳答案
您的脚本有多个问题。
'$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 )。
关于linux - 获取不同 HPUX unix 服务器的 CPU 和内存信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29405227/