如何通过nohup命令实现进程的自动重启
nohup命令不内置自动重启功能,进程意外退出后不会自动恢复。实现自动重启有两种常见方案:通过while循环编写Shell脚本,利用死循环不断重启进程,简单但控制粗糙;或使用supervisord等专业进程管理工具,支持配置自动重启、日志管理等功能,更适应生产环境。
nohup 命令本身的特点,就是让进程在用户退出登录后依然能继续运行——但注意,它并不内置自动重启功能。换句话说,进程一旦意外退出,它就真的“退”了,不会自己回来。那么,想让进程挂了之后自动复活,该怎么办?常见的有两种思路:一种是靠脚本里的 while 循环自己兜底,另一种是借助专业的进程管理工具 supervisord 来监控和重启。下面分别展开。

方法一:用 while 循环实现简单重启
这种方法最直接,不需要额外安装任何工具。核心思路是:写一个 Shell 脚本,里面套一个死循环,每次用 nohup 启动目标进程,然后等它结束;一旦结束,就自动重启,中间可以加个短暂的休眠。
来看一个示例脚本:
#!/bin/bash
# 要运行的命令
COMMAND="your_command_here"
# 无限循环
while true; do
# 使用 nohup 运行命令,并将输出重定向到文件
nohup $COMMAND > output.log 2>&1 &
# 获取刚刚启动的进程的 PID
PID=$!
# 等待进程结束
wait $PID
# 输出提示信息
echo "Process $PID exited with status $? - restarting"
# 等待一段时间(例如 5 秒)再重新启动
sleep 5
done
把这个脚本保存为 restart_on_exit.sh,然后 chmod +x restart_on_exit.sh 赋予执行权限,最后直接运行:
./restart_on_exit.sh
好处是简单,坏处是循环本身也会消耗一点资源,而且如果进程频繁崩溃,它就会不停重启,缺乏更精细的控制。
方法二:用 supervisord 来专业管理
如果你需要更可靠、更易维护的方案,supervisord 是行业里常用的选择。它是一个进程管理工具,专门负责监控进程,并且能在进程异常退出时自动重启。用起来分几步走:
安装
supervisord
大多数 Linux 发行版都能直接通过包管理器安装。比如在 Ubuntu 上:sudo apt-get update sudo apt-get install supervisor编写配置文件
在/etc/supervisor/conf.d/目录下新建一个配置文件,例如your_command.conf,内容如下:[program:your_command] command=your_command_here autostart=true autorestart=true stderr_logfile=/var/log/your_command.err.log stdout_logfile=/var/log/your_command.out.log记得把
your_command_here替换成你实际要运行的命令。启动
supervisord
执行:sudo supervisord -c /etc/supervisor/supervisord.conf这样
supervisord会加载所有配置文件,并开始管理进程。日常管理进程
通过supervisorctl命令可以轻松控制:sudo supervisorctl start your_command sudo supervisorctl stop your_command sudo supervisorctl status your_command
相比 while 循环,supervisord 提供了更丰富的功能:支持多进程管理、日志轮转、进程组控制等,适合生产环境。而 while 循环则胜在零依赖、轻量快捷。到底选哪个,取决于你的实际场景——想要省事就上脚本,想要省心就用工具。


































