如何让Linux设备上的Bash脚本持续运行并在崩溃后自动重启?
Linux下Bash脚本自动重启的实现方案
方法一:用Bash循环直接监控
这是最轻量化的方案,无需额外工具,适合快速部署。
写一个监控脚本(比如restart_my_script.sh),用while循环持续执行目标脚本,脚本崩溃后自动重启:
#!/bin/bash while true; do # 运行目标脚本 ./my_script.sh # 可选:记录重启日志 echo "脚本已崩溃,$(date) 正在重启..." >> script_restart.log # 可选:避免频繁重启,等待2秒再重启 sleep 2 done
使用方式
- 给监控脚本加执行权限:
chmod +x restart_my_script.sh - 后台运行监控脚本:
nohup ./restart_my_script.sh &nohup可让脚本在终端关闭后继续运行,输出默认写入nohup.out
方法二:用systemd系统服务(推荐生产环境)
systemd是现代Linux发行版的默认初始化系统,自带进程监控与自动重启能力,可靠性高。
步骤1:创建systemd服务文件
在/etc/systemd/system/目录下创建my_script.service文件,内容如下:
[Unit] Description=持久运行的Bash脚本 After=network.target # 脚本依赖网络时添加,否则可省略 [Service] Type=simple ExecStart=/绝对路径/到/你的/my_script.sh # 替换为脚本实际绝对路径 Restart=always # 无论脚本以何种方式终止,均自动重启 RestartSec=2 # 重启前等待2秒 User=你的用户名 # 可选,指定运行脚本的用户 StandardOutput=journal+console # 日志输出到systemd日志和控制台 StandardError=journal+console [Install] WantedBy=multi-user.target # 系统启动时自动加载服务
步骤2:启用并启动服务
# 重新加载systemd配置 sudo systemctl daemon-reload # 设置开机自启 sudo systemctl enable my_script.service # 启动服务 sudo systemctl start my_script.service
状态与日志查看
- 查看服务状态:
sudo systemctl status my_script.service - 实时跟踪日志:
journalctl -u my_script.service -f
方法三:用supervisor进程管理工具
supervisor是专门的进程管理工具,适合同时管理多个需持续运行的进程。
步骤1:安装supervisor
- Debian/Ubuntu:
sudo apt-get install supervisor - RHEL/CentOS:
sudo yum install supervisor
步骤2:创建配置文件
在/etc/supervisor/conf.d/目录下创建my_script.conf文件,内容如下:
[program:my_script] command=/绝对路径/到/你的/my_script.sh # 脚本绝对路径 autostart=true # 启动supervisor时自动启动脚本 autorestart=true # 脚本崩溃时自动重启 startretries=3 # 启动失败重试次数 user=你的用户名 # 指定运行脚本的用户 stdout_logfile=/var/log/my_script_out.log # 标准输出日志路径 stderr_logfile=/var/log/my_script_err.log # 错误输出日志路径
步骤3:更新配置并启动
# 更新supervisor配置 sudo supervisorctl reread sudo supervisorctl update # 启动脚本进程 sudo supervisorctl start my_script
常用命令
- 查看进程状态:
sudo supervisorctl status - 重启脚本:
sudo supervisorctl restart my_script - 停止脚本:
sudo supervisorctl stop my_script
内容的提问来源于stack exchange,提问作者Janzaib M Baloch
相关产品推荐
相关产品推荐

