You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:29:01