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

如何在FreeBSD重启后从Shell脚本中断点继续执行

解决FreeBSD升级脚本重启后继续执行的问题

作为Shell脚本新手,遇到这种重启中断脚本的情况太正常了——毕竟重启会直接终止当前运行的所有进程,包括你的升级脚本。不过有几种可靠的方法能让系统重启后自动完成剩余的freebsd-update install步骤,下面给你详细讲两种最适合新手的方案:

方案一:标记文件+启动脚本触发后续步骤

这种方法的核心是在重启前留下一个"标记",让系统启动时识别到这个标记,自动执行剩余的升级命令,逻辑清晰且容易调试。

  1. 修改你的升级脚本,在执行重启前创建标记文件,并把后续命令写入单独的脚本:

    # 执行初始升级命令
    freebsd-update upgrade -r 11.1-RELEASE
    freebsd-update install
    
    # 创建标记文件,告诉系统重启后要继续升级
    touch /root/upgrade_in_progress
    
    # 写入后续执行的脚本
    cat > /root/post_upgrade.sh << EOF
    #!/bin/sh
    # 执行剩余的install命令
    freebsd-update install
    
    # 完成后清理标记和脚本,避免下次启动重复执行
    rm /root/upgrade_in_progress
    rm /root/post_upgrade.sh
    EOF
    
    # 给脚本添加执行权限
    chmod +x /root/post_upgrade.sh
    
    # 重启系统
    shutdown -r now
    
  2. 修改rc.local文件(系统启动最后阶段会执行这个文件),添加检查标记的逻辑:
    编辑/etc/rc.local,在末尾加上:

    if [ -f /root/upgrade_in_progress ]; then
        /root/post_upgrade.sh
    fi
    

    保存后确保rc.local有执行权限:chmod +x /etc/rc.local

这样系统重启后,rc.local会检测到标记文件,自动运行后续脚本完成升级,最后清理痕迹避免重复执行。

方案二:用at命令安排重启后的任务

at命令可以帮你在指定时间执行任务,这里我们可以利用它在重启后立刻触发剩余命令,步骤更简洁。

在你的升级脚本里,先安排好重启后的任务,再执行重启:

# 初始升级步骤
freebsd-update upgrade -r 11.1-RELEASE
freebsd-update install

# 确保atd服务已启动(第一次用需要执行)
service atd start
service atd enable

# 安排重启后1分钟执行剩余的install命令
echo "freebsd-update install" | at now + 1 minute

# 重启系统
shutdown -r now

注意:at命令依赖atd服务,必须确保它处于运行状态,上面的脚本已经包含了启用和启动的命令。

这种方法适合简单场景,但要注意at的执行环境和你当前脚本的环境可能略有差异,不过对于freebsd-update这类系统级命令来说,一般不会有问题。

小提醒

  • 建议先在测试服务器上验证方案,避免影响生产环境。
  • 如果遇到需要多次重启的升级场景,可以扩展标记文件的逻辑,比如用不同的标记区分不同的升级阶段。

内容的提问来源于stack exchange,提问作者sno0z3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:09:53