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

如何使用until loop实现多进程监控及异常自动重启

多进程并行监控实现方案

你构想的伪代码无法满足需求:shell中until后的命令会串行执行,只有所有命令执行完成才会进入循环体,且$?仅会保留最后一条命令的退出码,既无法并行监控三个进程的运行状态,也无法分别获取每个服务的退出状态。

正确的实现思路是为每个服务单独创建独立的监控循环,全部放到后台运行,互不干扰。

基础可运行实现代码

# 封装通用的单服务监控函数
monitor_service() {
    local service_name="$1"
    until "$service_name"; do
        echo "Server '$service_name' crashed with exit code $?.  Respawning.." >&2
        sleep 1
    done
}

# 启动三个服务的独立监控任务,全部放到后台运行
monitor_service myserver &
monitor_service myserver2 &
monitor_service myserver3 &

# 主进程等待所有后台任务运行,避免脚本直接退出
wait

代码逻辑说明

  • 通用函数monitor_service接收服务名作为参数,复用监控重启逻辑,避免重复编码
  • 每个服务的监控循环通过&放到后台独立运行,任意服务崩溃只会触发自身的重启逻辑,不会影响其余两个服务的正常运行
  • 末尾的wait命令保证主脚本持续持有运行状态,不会在后台任务启动后直接退出

可选优雅退出优化

如果需要支持脚本停止时同步关闭所有正在运行的服务,可以增加信号捕获逻辑:

# 存储所有后台监控任务的PID
declare -a service_pids

# 定义终止信号处理逻辑,停止所有服务后退出
cleanup() {
    echo "Stopping all monitored services..."
    for pid in "${service_pids[@]}"; do
        kill "$pid" 2>/dev/null
    done
    exit 0
}

# 捕获终止、中断信号触发清理流程
trap cleanup SIGTERM SIGINT

# 通用监控函数
monitor_service() {
    local service_name="$1"
    until "$service_name"; do
        echo "Server '$service_name' crashed with exit code $?.  Respawning.." >&2
        sleep 1
    done
}

# 启动监控时记录对应PID
monitor_service myserver &
service_pids+=("$!")
monitor_service myserver2 &
service_pids+=("$!")
monitor_service myserver3 &
service_pids+=("$!")

wait

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:15:07