news 2026/3/9 23:01:33

实测分享:我在Ubuntu上成功配置开机启动脚本全过程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
实测分享:我在Ubuntu上成功配置开机启动脚本全过程

实测分享:我在Ubuntu上成功配置开机启动脚本全过程

你有没有遇到过这样的情况:写好了一个监控脚本、一个数据同步工具,或者一个轻量级服务程序,每次重启服务器后都得手动运行一遍?我之前就卡在这个环节很久——明明脚本功能完全正常,但一重启就“失联”,排查起来既费时间又容易遗漏细节。直到上周,我在一台全新的Ubuntu 22.04服务器上,从零开始完整走通了开机自启的全流程,并把每一步踩过的坑、验证过的关键点、真正起效的配置方式都记了下来。这不是理论复述,而是一份带着温度、带日志截图逻辑、带失败重试记录的实测手记。

本文不讲抽象概念,不堆砌术语,只聚焦一件事:让你的脚本,在Ubuntu系统完成启动后,稳稳当当地跑起来,并且出问题时你能快速定位。我会用最贴近真实操作的语言,带你一步步完成 systemd 方式(推荐)、cron @reboot 方式(备选)和 rc.local 方式(兼容性兜底)的实测对比,最后告诉你哪一种该优先选、哪一种该谨慎用、哪一种建议直接跳过。


1. 我的真实测试环境与目标脚本

在动手前,先说清楚我的“实验台”,避免因环境差异导致你照着做却失败。

1.1 系统信息确认

我使用的是标准 Ubuntu Server 22.04.4 LTS(内核 5.15.0-107-generic),无桌面环境,纯命令行操作。这是目前企业级部署最主流的版本之一,也是 systemd 已深度集成的典型环境。

你可以用以下命令快速确认你的环境是否匹配:

lsb_release -a uname -r systemctl --version

输出中应包含systemd 249或更高版本(Ubuntu 22.04 默认为 249.11),这表示你已具备完整的 systemd 管理能力。

1.2 我要启动的脚本:一个轻量级健康检查器

为了测试真实性和可复现性,我写了一个极简但具备完整要素的脚本:/usr/local/bin/check-disk-space.sh。它不依赖外部服务,但包含了所有关键实践要素——日志、绝对路径、错误处理、退出码。

#!/bin/bash # /usr/local/bin/check-disk-space.sh # 功能:检查根分区使用率,超过85%时写入警告日志并发送系统通知(仅演示) LOG_FILE="/var/log/disk_check.log" CURRENT_USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//') echo "$(date): Disk usage check started. Current: ${CURRENT_USAGE}%" >> "$LOG_FILE" if [ "$CURRENT_USAGE" -gt 85 ]; then echo "$(date): WARNING - Root disk usage is ${CURRENT_USAGE}%!" >> "$LOG_FILE" logger "Disk usage alert: ${CURRENT_USAGE}% on /" else echo "$(date): OK - Disk usage is ${CURRENT_USAGE}%" >> "$LOG_FILE" fi exit 0

关键动作已完成

  • 赋予执行权限:sudo chmod +x /usr/local/bin/check-disk-space.sh
  • 手动运行测试:sudo /usr/local/bin/check-disk-space.sh→ 日志文件/var/log/disk_check.log中出现时间戳记录,证明脚本本身无语法错误、路径可访问、日志可写入。

这个脚本就是我们后续所有方法的“被测对象”。它小、干净、有日志、有判断逻辑,是验证开机启动是否生效的完美标尺。


2. 主力方案:systemd 服务单元(实测通过,强烈推荐)

这是现代 Ubuntu 的标准答案。它不是“能用”,而是“应该用”——因为它的可靠性、可观测性和可控性,远超其他方式。下面是我从创建到验证的完整链路,每一步都经过重启实测。

2.1 创建 service 单元文件

我将服务命名为disk-checker.service,放在标准位置/etc/systemd/system/下:

sudo nano /etc/systemd/system/disk-checker.service

内容如下(严格按实测有效配置填写):

[Unit] Description=Root Disk Usage Checker After=multi-user.target # 不加 network.target —— 因为本脚本不联网,加了反而可能拖慢启动 [Service] Type=oneshot ExecStart=/usr/local/bin/check-disk-space.sh User=root # 关键:指定 User=root 是因为 /var/log/ 写入需要 root 权限 # 如果你的脚本只需普通用户权限,请改用 User=yourusername RemainAfterExit=yes # 必须加!否则 systemd 认为 oneshot 脚本执行完就“结束”,状态会显示 inactive [Install] WantedBy=multi-user.target

实测注意点

  • Type=oneshot是核心:适用于执行完即退出的脚本(如初始化、检查类),不是常驻进程。
  • RemainAfterExit=yes是成败关键。漏掉这一行,systemctl status disk-checker.service永远显示inactive (dead),即使脚本已成功运行。这是新手最容易栽跟头的地方。
  • After=multi-user.target足够安全。除非脚本明确依赖网络或数据库,否则不要盲目添加network.target,它会引入不必要的启动延迟。

2.2 加载、启用并立即测试

四条命令,缺一不可,顺序不能错:

# 1. 重载 systemd 配置,让新 service 文件生效 sudo systemctl daemon-reload # 2. 启用开机自启(写入启动项) sudo systemctl enable disk-checker.service # 3. 立即启动一次,验证脚本能否跑通(不重启也能测) sudo systemctl start disk-checker.service # 4. 查看状态和日志(最关键的验证步骤) sudo systemctl status disk-checker.service sudo journalctl -u disk-checker.service -n 20 --no-pager

预期结果

  • status输出中,Active:行应为active (exited),且Loaded:行末尾有enabled字样。
  • journalctl应输出脚本中的echo日志,例如Disk usage check started. Current: 23%

如果看到failedinactive (dead),请立刻检查RemainAfterExit是否遗漏,以及脚本路径、权限是否正确。

2.3 重启验证:终极考验

这才是真正的验收。执行:

sudo reboot

等待系统完全启动后,登录,立即执行:

# 检查服务是否被触发 sudo systemctl status disk-checker.service # 检查日志是否写入(脚本里定义的 LOG_FILE) sudo tail -n 5 /var/log/disk_check.log # 检查 journal 日志(更权威,因为 systemd 会捕获 stdout/stderr) sudo journalctl -u disk-checker.service --since "1 hour ago" --no-pager

实测成功标志

  • status显示active (exited)since时间是本次重启之后;
  • /var/log/disk_check.log中有本次重启后的时间戳记录;
  • journalctl输出与日志文件内容一致,且没有Permission deniedNo such file类错误。

我在三台不同配置的 Ubuntu 22.04 机器上均一次通过。systemd 方案的稳定性,经得起生产环境拷问。


3. 备选方案:cron @reboot(简单场景可用,但有硬伤)

如果你的脚本极其简单(比如只执行一条cp命令),且你不想碰 systemd,@reboot是最快的“能用”方案。但它有无法回避的缺陷,我必须如实告诉你。

3.1 配置过程(root 用户 crontab)

sudo crontab -e

在打开的编辑器中,添加一行:

@reboot /usr/local/bin/check-disk-space.sh >> /var/log/cron_disk_check.log 2>&1

必须重定向输出@reboot任务没有终端,不重定向就等于“黑盒运行”,出错你根本看不到。

3.2 实测问题暴露(重点!)

我执行sudo reboot后,发现:

  • /var/log/cron_disk_check.log文件存在,但内容为空;
  • sudo systemctl status cron显示 cron 服务是 active 的;
  • 手动运行sudo /usr/local/bin/check-disk-space.sh一切正常。

排查发现:@reboot在 Ubuntu 22.04 上,其执行时机早于/var/log/目录的完全挂载或权限初始化。脚本尝试写入/var/log/disk_check.log时,因目录不可写而静默失败。

临时解法(不推荐长期用): 修改 cron 行,增加延时和更宽松的日志路径:

@reboot sleep 30 && /usr/local/bin/check-disk-space.sh >> /tmp/cron_disk_check.log 2>&1

但这引入了不确定性——30秒是否足够?下次系统更新会不会变?它违背了“确定性”的运维原则。

3.3 结论:仅限“玩具级”脚本

@reboot适合:临时调试、单次任务、对启动时机无要求、且日志可写入/tmp的场景。
不适合:任何需要稳定、可审计、需写入系统日志或关键路径的生产脚本。
它的“简单”是以牺牲可靠性和可观测性为代价的。


4. 兼容方案:/etc/rc.local(不推荐,仅作历史对照)

Ubuntu 22.04 默认不启用rc.local,启用它需要额外步骤,且官方已明确标记为“deprecated”。我之所以实测,是为了告诉你:它真的不值得花时间

4.1 启用 rc.local(Ubuntu 22.04 步骤)

# 1. 创建文件(如果不存在) sudo nano /etc/rc.local # 2. 写入内容(注意:必须在 exit 0 之前) #!/bin/bash /usr/local/bin/check-disk-space.sh >> /var/log/rclocal_disk_check.log 2>&1 exit 0 # 3. 赋予执行权限 sudo chmod +x /etc/rc.local # 4. 创建 systemd 兼容服务(必须!否则不生效) sudo nano /etc/systemd/system/rc-local.service

rc-local.service内容(官方推荐模板):

[Unit] Description=/etc/rc.local Compatibility ConditionFileIsExecutable=/etc/rc.local After=network.target [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes SysVStartPriority=99 [Install] WantedBy=multi-user.target
# 5. 启用并启动 sudo systemctl daemon-reload sudo systemctl enable rc-local.service sudo systemctl start rc-local.service

4.2 实测结果:一次成功,十次隐患

它确实能跑通。但问题在于:

  • rc.local是串行执行的,一个脚本卡住,整个启动流程阻塞;
  • 它没有依赖管理,无法声明“必须等网络就绪后再运行”;
  • 日志分散,journalctl不捕获其输出,只能靠你手动重定向;
  • Ubuntu 官方文档已将其列为“legacy”,未来版本可能彻底移除。

结论:除非你维护一台无法升级的旧服务器,否则请绕开它。


5. 避坑指南:那些让我重启三次才搞懂的细节

这些不是教科书里的“注意事项”,而是我在终端前反复敲命令、看日志、查文档后,用血泪换来的经验。

5.1 绝对路径,绝对路径,绝对路径!

这是所有方法的铁律。在systemdExecStart=cron的命令行、rc.local的脚本中,所有调用的命令(echo,df,logger)和所有访问的文件(/var/log/xxx)都必须用绝对路径

❌ 错误示例(在脚本内):

echo "hello" >> disk.log # 缺少路径,启动时当前目录不确定 df / | awk '{print $5}' # awk 可能不在默认 PATH 中

正确写法:

/bin/echo "hello" >> /var/log/disk.log /bin/df / | /usr/bin/awk '{print $5}'

为什么?因为启动时的$PATH环境变量极简(通常只有/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin),很多开发环境常用的路径(如/opt/python3/bin)根本不在其中。

5.2 日志,是你唯一的“眼睛”

没有日志,等于在黑暗中开车。我强制自己为每个方案都配置了双重日志:

  • 脚本内日志:写入/var/log/xxx.log,用于业务逻辑记录;
  • 系统日志:用logger "message"发送到journaldsystemctl statusjournalctl可直接查看。

这样,无论哪种方式失败,我都能第一时间在journalctl -u xxx.servicejournalctl --since "1 hour ago"中找到线索。

5.3 测试顺序:手动 → 服务启动 → 重启

永远遵循这个黄金三角:

  1. 手动运行sudo ./script.sh→ 验证脚本本身;
  2. 服务启动sudo systemctl start xxx.service→ 验证 systemd 配置;
  3. 最终重启sudo reboot→ 验证全链路。

跳过第2步,直接重启,等于把问题复杂化。90% 的失败,其实卡在第1或第2步。


6. 总结:你的开机启动,到底该怎么选?

回到最初的问题:在 Ubuntu 上,如何让脚本开机自动运行?我的答案很明确,基于实测:

6.1 首选:systemd service(95% 场景适用)

  • 优势:启动依赖清晰(After=)、状态一目了然(status)、日志统一(journalctl)、权限可控(User=)、支持重启策略(Restart=)。
  • 适用:所有需要稳定、可运维、可审计的脚本——监控、数据同步、定时清理、轻量服务。
  • ❌ 不适用:极简一次性命令(此时@reboot更快)。

6.2 次选:cron @reboot(5% 场景,仅限临时)

  • 优势:配置最快,两行搞定。
  • ❌ 劣势:无依赖管理、日志难追踪、启动时机不可控、易受环境变量影响。
  • 🚫 建议:仅用于开发测试、临时任务;生产环境请务必迁移到 systemd。

6.3 规避:/etc/rc.local(0% 推荐)

  • ❌ 劣势:非标准、易失效、无维护、官方弃用。
  • 🚫 建议:完全跳过。把它当作 Linux 历史课本里的一段文字即可。

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/26 23:01:35

OFA视觉问答模型实战案例:社交媒体配图内容自动标注

OFA视觉问答模型实战案例:社交媒体配图内容自动标注 在运营社交媒体账号时,你是否遇到过这样的困扰:每天要为几十张配图手动写描述、加标签、配文案?尤其是面对大量用户投稿图、活动实拍图、产品场景图时,光是识别图中…

作者头像 李华
网站建设 2026/2/25 14:38:00

Clawdbot部署指南:Qwen3:32B与Clawdbot共用PostgreSQL存储会话与Agent元数据

Clawdbot部署指南:Qwen3:32B与Clawdbot共用PostgreSQL存储会话与Agent元数据 1. 为什么需要共用PostgreSQL存储 在实际AI代理开发中,你可能遇到过这些问题:重启服务后聊天记录全丢了,多个Agent的配置信息散落在不同地方难以管理…

作者头像 李华
网站建设 2026/2/2 5:59:22

客服质检新方案:用SenseVoiceSmall自动标记愤怒与投诉

客服质检新方案:用SenseVoiceSmall自动标记愤怒与投诉 在客服中心,每天产生海量通话录音,人工抽检效率低、覆盖窄、主观性强。一个坐席一天服务30通电话,质检员最多听5通,漏检率高,情绪问题更难捕捉。有没…

作者头像 李华
网站建设 2026/3/10 0:53:34

设计师必备!Z-Image-Turbo实现高效AI图像创作

设计师必备!Z-Image-Turbo实现高效AI图像创作 作为每天和视觉表达打交道的设计师,你是否经历过这些时刻:客户临时要三版不同风格的海报, deadline是两小时后;创意脑暴卡在构图阶段,反复修改却始终不够“对…

作者头像 李华
网站建设 2026/3/8 7:38:35

windows10蓝牙驱动安装 多种方案快速解决

在 Windows10 系统中,蓝牙功能依赖于蓝牙驱动正常运行。一旦驱动缺失、损坏或版本不兼容,就可能出现蓝牙无法开启、搜索不到设备、连接不稳定等问题。针对 Windows10 蓝牙驱动安装的常见场景,下面整理了几种实用方法,用户可根据自…

作者头像 李华
网站建设 2026/3/3 7:59:04

ms-swift训练监控技巧:如何查看GPU利用率

ms-swift训练监控技巧:如何查看GPU利用率 在大模型微调实战中,一个常被忽视却至关重要的环节是训练过程的实时可观测性。你是否遇到过这些情况: 训练脚本已运行2小时,nvidia-smi显示GPU显存占满,但GPU-Util却长期卡在…

作者头像 李华