You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

这样一来,每次系统重启后,这个服务都会自动触发你的脚本,结合前面的标记文件,脚本就会跳过已经完成的阶段,直接从上次中断的地方继续执行。

额外小提示

  1. 给脚本加执行权限:chmod +x /path/to/your/setup_script.sh,确保系统能运行它。
  2. 如果是无人值守的环境,建议在脚本里加上DEBIAN_FRONTEND=noninteractive前缀,避免安装过程中弹出交互提示,比如:DEBIAN_FRONTEND=noninteractive apt install -y nginx。
  3. 所有步骤完成后,记得禁用那个systemd服务,避免下次重启又跑一遍:systemctl disable setup-script.service(也可以像上面例子一样,在脚本最后自动执行这个命令)。

我个人最常用的就是「标记文件+systemd自启」的组合,几乎能搞定所有需要中途重启的自动化配置场景,你可以根据自己的实际步骤调整阶段划分~

备注:内容来源于stack exchange,提问作者Voldemort's Wrath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 10:54:31