如何编写Bash脚本实现双二进制程序崩溃后按顺序自动重启
结论:检查PID不是该需求的最优方案
PID方案存在两个天然缺陷:
- 系统会复用回收的PID,若原进程崩溃后PID被其他进程占用,会出现「PID存在但目标进程已退出」的误判
- 若通过进程名匹配PID,系统中存在其他同名进程时也会导致监控逻辑出错
- 定时轮询检查PID会产生不必要的CPU开销,进程退出的感知延迟取决于轮询间隔
更优实现方案
推荐直接通过Bash内置的后台进程控制与wait命令实现监控,无需轮询、判断准确率更高,完全匹配你的启动顺序、故障重启要求。
可用脚本示例
#!/bin/bash # 替换为你的二进制文件绝对路径 HELLO1="/opt/app/hello1" HELLO2="/opt/app/hello2" while true; do # 按顺序启动hello1 "$HELLO1" & pid1=$! # 按需调整等待时间,确保hello1启动完成后再启动hello2 sleep 3 # 启动hello2 "$HELLO2" & pid2=$! # 阻塞等待任意一个进程退出,立刻进入重启流程 wait -n "$pid1" "$pid2" # 清理残留进程,避免影响下一轮启动 kill "$pid1" "$pid2" 2>/dev/null wait "$pid1" "$pid2" 2>/dev/null done
逻辑说明
- 严格遵循先启动hello1、再启动hello2的顺序,可根据hello1的实际启动耗时调整sleep的时长,也可增加端口探测、日志关键字匹配等逻辑确认hello1启动成功后再启动hello2
wait -n命令会在任意一个被监听的进程退出时立刻返回,没有轮询开销,进程故障感知无额外延迟- 每次重启前会主动杀死两个进程,避免出现孤儿进程、残留进程占用资源或端口
内容的提问来源于stack exchange,提问作者takanoha
相关产品推荐
相关产品推荐

