如何在FreeBSD重启后从Shell脚本中断点继续执行
解决FreeBSD升级脚本重启后继续执行的问题
作为Shell脚本新手,遇到这种重启中断脚本的情况太正常了——毕竟重启会直接终止当前运行的所有进程,包括你的升级脚本。不过有几种可靠的方法能让系统重启后自动完成剩余的freebsd-update install步骤,下面给你详细讲两种最适合新手的方案:
方案一:标记文件+启动脚本触发后续步骤
这种方法的核心是在重启前留下一个"标记",让系统启动时识别到这个标记,自动执行剩余的升级命令,逻辑清晰且容易调试。
修改你的升级脚本,在执行重启前创建标记文件,并把后续命令写入单独的脚本:
# 执行初始升级命令 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修改
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
相关产品推荐
相关产品推荐

