Ubuntu下Bash脚本执行中途重启后如何继续完成服务配置?
Ubuntu下Bash脚本执行中途重启后如何继续完成服务配置?
嘿,这个问题我之前帮不少开发者解决过——中途重启确实会直接打断脚本执行,但咱们可以通过「记录进度+开机自启」的组合拳,让脚本重启后自动接着完成剩下的配置。下面给你几个实用的方案:
方法1:通过状态标记文件记录进度
这是最直观也最常用的方案,核心思路是把你的配置流程拆成多个阶段,每个阶段完成后创建一个「标记文件」,脚本启动时先检查这些标记,跳过已经完成的步骤。
举个实际的脚本例子,你可以照着改:
#!/bin/bash # 创建专门存放标记文件的目录,选不会被重启清空的路径 MARKER_DIR="/var/tmp/setup_progress" mkdir -p "$MARKER_DIR" # 阶段1:基础环境初始化 if [ ! -f "$MARKER_DIR/phase1_done" ]; then echo "正在执行阶段1:基础环境配置..." # 这里替换成你的实际命令,比如更新源、安装依赖 apt update && apt install -y curl wget # 标记该阶段完成 touch "$MARKER_DIR/phase1_done" # 提示并重启 echo "阶段1完成,系统即将重启..." reboot fi # 阶段2:核心服务安装 if [ ! -f "$MARKER_DIR/phase2_done" ]; then echo "正在执行阶段2:核心服务安装..." # 替换成你的服务安装命令,比如Nginx、MySQL apt install -y nginx mysql-server # 标记该阶段完成 touch "$MARKER_DIR/phase2_done" # 再次重启(如果需要的话) echo "阶段2完成,系统即将重启..." reboot fi # 阶段3:收尾与优化 if [ ! -f "$MARKER_DIR/phase3_done" ]; then echo "正在执行阶段3:收尾配置..." # 比如设置服务开机自启、调整配置参数 systemctl enable nginx mysql # 标记所有步骤完成 touch "$MARKER_DIR/phase3_done" echo "所有配置已完成!" # 可选:如果配置了开机自启,这里可以禁用服务避免重复执行 systemctl disable setup-script.service fi
注意:不要把标记文件放在/tmp目录下,因为多数Ubuntu系统重启后会自动清空/tmp的内容,导致进度丢失。
方法2:配置开机自启,让脚本重启后自动运行
光有标记文件还不够,得确保重启后脚本能自动跑起来。这里推荐用systemd来配置,比传统的rc.local更可靠(新版Ubuntu默认不启用rc.local)。
步骤1:创建systemd服务文件
# 替换成你的脚本实际路径 SCRIPT_PATH="/path/to/your/setup_script.sh" cat > /etc/systemd/system/setup-script.service << EOF [Unit] Description=自动执行配置脚本(重启后继续) After=network.target # 确保网络就绪后再执行 [Service] ExecStart=$SCRIPT_PATH Type=oneshot # 只执行一次 RemainAfterExit=yes # 执行完成后保持服务状态 [Install] WantedBy=multi-user.target # 多用户环境下启用 EOF
步骤2:启用并启动服务
# 重新加载systemd配置 systemctl daemon-reload # 设置开机自启 systemctl enable setup-script.service # 立即启动脚本(如果需要现在开始执行) systemctl start setup-script.service
这样一来,每次系统重启后,这个服务都会自动触发你的脚本,结合前面的标记文件,脚本就会跳过已经完成的阶段,直接从上次中断的地方继续执行。
额外小提示
- 给脚本加执行权限:
chmod +x /path/to/your/setup_script.sh,确保系统能运行它。 - 如果是无人值守的环境,建议在脚本里加上
DEBIAN_FRONTEND=noninteractive前缀,避免安装过程中弹出交互提示,比如:DEBIAN_FRONTEND=noninteractive apt install -y nginx。 - 所有步骤完成后,记得禁用那个systemd服务,避免下次重启又跑一遍:
systemctl disable setup-script.service(也可以像上面例子一样,在脚本最后自动执行这个命令)。
我个人最常用的就是「标记文件+systemd自启」的组合,几乎能搞定所有需要中途重启的自动化配置场景,你可以根据自己的实际步骤调整阶段划分~
备注:内容来源于stack exchange,提问作者Voldemort's Wrath
相关产品推荐
相关产品推荐

