BASH脚本循环执行异常:重复输出首个服务器名问题排查
问题排查与修正方案
兄弟,你的脚本核心问题一眼就能看到——循环里SSH的目标用错了变量!
你看,for i in $SERVERS是逐个遍历服务器列表,但里面写的是ssh $SERVERS,这等于每次循环都同时SSH到所有服务器(server1和server2),而不是当前循环的$i。所以第一次循环会同时执行两台服务器的检查并输出,第二次循环又重复来一遍,自然会出现重复输出的问题。
除此之外,脚本还有几个可以优化和修正的地方:
- 远程生成临时文件完全没必要,直接管道处理就行
- 你的
grep -E "1[5-9]"逻辑完全不对,这是找15-19的数字,但阈值是90,应该直接提取使用率数字和90比较 df -h的输出带人类可读单位,不如用df -P(POSIX标准格式)来获取更稳定的百分比数字
下面是修正并优化后的脚本:
#!/bin/bash SERVERS="server1 server2" THRESHOLD=90 for server in $SERVERS; do # 远程执行磁盘检查,直接返回超过阈值的主机名 ssh "$server" ' # 提取/var分区的使用率百分比(去掉%) usage=$(df -P /var | awk "NR==2 {print \$5}" | sed "s/%//") # 比较阈值 if [ "$usage" -gt '"$THRESHOLD"' ]; then hostname fi ' >> /home/user/problem.txt done
关键改进点:
- 把
ssh $SERVERS改成ssh "$server",确保每次循环只连接当前服务器 - 去掉远程临时文件,直接用管道提取/var分区的使用率(
NR==2跳过df的表头) - 阈值变量提到循环外,避免重复定义,并且远程引用本地变量时用
'"$THRESHOLD"'的方式传递 - 用
df -P保证输出格式稳定,不会因为不同系统的df输出差异导致错误 - 简化判断逻辑,直接比较使用率和阈值,不需要多余的exit判断
这样运行后,只会把磁盘使用率超过90%的服务器名称写入problem.txt,不会再出现重复输出的问题。
内容的提问来源于stack exchange,提问作者zoomer
相关产品推荐
相关产品推荐

