如何使用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
相关产品推荐
相关产品推荐

