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

多服务器进程等待Bash脚本优化:解决仅检测首个IP问题

修复SSH批量检查进程并等待结束的脚本

我猜你的原始脚本里大概率是把continue放错了位置——如果它不小心出现在遍历IP的外层循环里,会导致处理完第一个IP后直接跳过剩下的所有服务器。咱们来调整逻辑,确保每个IP都能被正常处理:

修复后的脚本示例

#!/bin/bash
# 替换成你实际要检查的目标进程名
TARGET_PROCESS="your_target_process_name"

# 遍历ip.txt中的每一行IP
while IFS= read -r ip; do
    # 跳过空行,避免处理无效条目
    if [[ -z "$ip" ]]; then
        continue
    fi

    echo "=== 开始处理服务器: $ip ==="

    # 先远程检查进程是否在运行
    ssh -q "$ip" "ps aux | grep '$TARGET_PROCESS' | grep -v grep"
    if [[ $? -ne 0 ]]; then
        echo "⚠️ $ip 上目标进程未运行,跳过等待步骤"
        # 这里的continue是跳过当前IP的后续等待逻辑,转而处理下一个IP
        continue
    fi

    # 循环等待进程结束
    echo "⏳ 等待 $ip 上的目标进程结束..."
    while true; do
        ssh -q "$ip" "ps aux | grep '$TARGET_PROCESS' | grep -v grep"
        if [[ $? -ne 0 ]]; then
            echo "✅ $ip 上的目标进程已结束"
            # 用break退出内层等待循环,回到外层IP遍历
            break
        fi
        sleep 10  # 每10秒检查一次,可根据需要调整间隔
    done

done < ip.txt

关键修复点说明

  • continue的正确用法:只有在当前IP无需等待(进程未运行)时,用continue跳过该IP的后续等待逻辑,转而处理下一个IP,而不是直接跳出整个IP遍历循环。
  • 健壮的IP读取:用IFS= read -r ip确保读取IP时保留空格、避免转义问题,同时添加空行判断,防止处理无效的空条目。
  • 静默SSH连接:加上-q参数让SSH输出更简洁,只关注进程检查的核心结果。
  • 进程名安全包裹:用单引号包裹进程名,避免进程名包含特殊字符时出现解析错误。

额外优化建议

  • 可以添加SSH超时设置:ssh -q -o ConnectTimeout=5 "$ip",避免因服务器不可达导致脚本长时间卡住。
  • 把进程检查逻辑封装成函数,让脚本更易维护:
check_process() {
    local ip=$1
    local process=$2
    ssh -q -o ConnectTimeout=5 "$ip" "ps aux | grep '$process' | grep -v grep" > /dev/null
    return $?
}

之后在脚本里只需调用check_process "$ip" "$TARGET_PROCESS"就能快速判断进程状态。

内容的提问来源于stack exchange,提问作者Nani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:37:36