在日常系统运维工作中,nohup 命令确实是后台运行程序的得力工具——它能让应用在终端关闭或连接断开后依然稳定运行,避免被 SIGHUP 信号终止。但 nohup 只负责启动,不负责监控与恢复,一旦程序崩溃或正常退出,它不会自动重新拉起进程。那么,如何实现程序的“崩溃自愈”与自动重启?下面两种方案是业界最常用的做法,直接拿来用即可。

方法一:使用 while 循环实现自动重启
最直接简单的办法,就是编写一个死循环脚本,将目标程序包裹在内。例如新建一个 run.sh 文件:
#!/bin/bash
while true; do
nohup your_command &
wait $!
echo "Program exited with code $? , restarting..."
sleep 5
done
将 your_command 替换为你要实际运行的命令,然后赋予脚本执行权限,直接运行即可:
chmod +x run.sh
./run.sh
这个脚本的核心逻辑非常清晰:一旦程序退出,等待 5 秒(可自行调整,例如 sleep 10),然后立即重新启动。循环会持续运行,直到你手动终止它。这里使用 wait $! 等待后台进程结束,并捕获退出码,再决定下一步动作。此方法的缺点在于:如果程序频繁崩溃,脚本会不断循环重启,缺乏更精细的控制策略——但对于大多数简单场景,已经足够实用。
方法二:使用 supervisord 进程管理工具
如果你觉得手写循环不够“专业”,或者需要更完善的进程管理功能(例如日志记录、状态监控、自动拉起策略),那么 supervisord 就是标准的选择。它是一款专为后台程序设计的管理守护工具,原生支持自动重启。
首先安装:
# 基于 Debian 的系统
sudo apt-get install supervisor
# 基于 RHEL 的系统
sudo yum install supervisor
安装完成后,创建一个配置文件,例如 /etc/supervisor/conf.d/your_program.conf:
[program:your_program]
command=your_command
autostart=true
autorestart=true
stderr_logfile=/var/log/your_program.err.log
stdout_logfile=/var/log/your_program.out.log
将 your_command 替换为实际命令,日志路径可按需自定义。然后重启 supervisord 使配置生效:
sudo service supervisor restart
此后,supervisord 会自动启动并管理你的程序,一旦程序退出(无论正常还是异常),它都会根据配置执行重启。你还可以设置 autorestart=unexpected 仅对非正常退出进行重启,或者通过 startretries 控制重试次数,灵活性远超 while 循环。
两种方法各有适用场景:追求快速上手、不想引入额外依赖的,用 while 循环即可;生产环境或需要精细化管理的,直接上 supervisor。根据实际需求选择,无需纠结。
