多服务器进程等待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
相关产品推荐
相关产品推荐

