while循环SSH多服务器获取大页信息返回空结果问题排查
问题产生的核心原因
- 双引号包裹SSH远程命令导致本地提前解析变量和命令:你用双引号包了要远程执行的内容,所有
$开头的变量、反引号包裹的命令都会在执行循环的本地主机(server1)先运行完成,再把结果传给远程主机。cat /proc/meminfo、hostname都是在server1本地执行的,所以返回的主机名永远是server1;算术运算$((...))也在本地提前计算,而你没有在本地提前定义freehugepages变量,最终计算出来的hpfgb是空值,远程执行时自然输出空。 - SSH命令未指定目标主机:你循环读出来的
$HOST变量根本没有传给SSH命令,SSH默认会连接本地主机,这也是所有返回结果都是server1的核心原因之一。
修复后的正确命令
while read -u10 HOST; do ssh -q "$HOST" 'hpfgb=$(( $(grep "HugePages_Free" /proc/meminfo | awk "{print \$NF}") * 2 / 1024 )); echo "$(hostname): Free Huge Pages in GB: $hpfgb"' done 10< /home/oracle/dbs_group
修复点说明
- 用单引号包裹远程执行的命令,所有变量、命令替换都会在远程主机执行,不会提前在本地解析
- 明确把循环读取的
$HOST变量传给SSH,指定要登录的远程主机 - 简化了变量取值逻辑,不需要单独export变量,直接在算术运算里取值即可
- 内层awk的
$NF做了转义,避免和外层语法冲突
内容的提问来源于stack exchange,提问作者codethirst
相关产品推荐
相关产品推荐

