亲测有效!用测试开机脚本实现Ubuntu自动运行
2026/6/10 18:07:42 网站建设 项目流程

亲测有效!用测试开机脚本实现Ubuntu自动运行

你有没有遇到过这样的场景:刚部署好一台Ubuntu服务器,需要每天手动启动监控脚本;或者树莓派接上电源后,还得连显示器、敲命令才能让摄像头服务跑起来?其实,只要一个简单可靠的开机自启方案,就能让系统“醒来就干活”。本文不讲抽象理论,只分享我在真实环境反复验证过的三套方法——全部在Ubuntu 22.04 LTS和树莓派OS上实测通过,从最轻量的rc.local到最规范的systemd,再到适配桌面环境的用户级方案,每一步都附带可直接复制粘贴的命令和避坑提示。

1. 为什么选这三种方案?先说清适用场景

很多教程一上来就堆砌命令,却没告诉你“什么时候该用哪个”。我用自己踩过的坑总结出一张实用对照表:

方案类型适合谁用启动时机权限要求稳定性典型用途
rc.local快速验证、临时调试、老旧脚本迁移所有系统服务启动完成后(网络已就绪)需root权限日志记录、硬件初始化、简单服务启动
systemd系统服务生产环境、长期运行、需状态管理按依赖关系精确控制(如必须等网络就绪)需root权限Web服务、数据库、后台守护进程
systemd用户服务桌面用户、个人应用、无需root权限用户登录后自动启动普通用户权限Telegram桌面通知、定时备份GUI工具、开发环境预热

关键提醒:Ubuntu 18.04之后默认禁用rc.local,但不是删除了它——而是systemd接管了控制权。强行启用没问题,但如果你的脚本依赖网络或图形界面,systemd方案才是更可靠的选择。

2. rc.local方案:5分钟搞定,适合快速验证

这是最接近传统Linux习惯的方式,特别适合第一次尝试自启的新手。它的优势在于:写法简单、调试直观、失败时能直接看到错误输出。

2.1 恢复rc.local支持(Ubuntu 20.04+必需)

系统默认不启用rc.local,我们需要手动激活它:

# 创建空的rc.local文件(如果不存在) sudo touch /etc/rc.local sudo chmod +x /etc/rc.local # 编辑文件,添加基础结构 sudo nano /etc/rc.local

在文件中输入以下内容(注意exit 0必须是最后一行):

#!/bin/bash # 在这里添加你的启动命令 echo "系统启动时间:$(date)" >> /var/log/my_startup.log # 你的脚本路径,例如: # /home/yourname/scripts/monitor.sh exit 0

2.2 关键配置:让systemd真正加载rc.local

仅创建文件还不够,必须告诉systemd去执行它:

# 启用systemd的rc-local服务 sudo systemctl enable rc-local # 检查服务状态(应显示active) sudo systemctl status rc-local

如果看到Failed to start,大概率是/etc/rc.local缺少执行权限或语法错误。用这条命令一键修复:

sudo chmod 755 /etc/rc.local

2.3 实战案例:一个会“说话”的开机脚本

我们来写一个真实可用的脚本——每次开机自动记录系统信息并播放语音提示(需安装espeak):

# 安装语音合成工具 sudo apt update && sudo apt install -y espeak # 创建脚本 nano ~/startup_notifier.sh

脚本内容如下:

#!/bin/bash # 记录启动日志 echo "=== $(date) ===" >> /var/log/startup_report.log echo "主机名: $(hostname)" >> /var/log/startup_report.log echo "IP地址: $(hostname -I)" >> /var/log/startup_report.log # 播放语音提示(后台运行,避免阻塞启动) espeak "System started at $(date +%H:%M)" 2>/dev/null &

赋予执行权限并加入rc.local:

chmod +x ~/startup_notifier.sh echo "/home/$(whoami)/startup_notifier.sh" | sudo tee -a /etc/rc.local

重启验证:

sudo reboot

开机后检查日志:

tail -n 10 /var/log/startup_report.log # 应看到类似: # === Mon Jun 10 09:23:45 CST 2024 === # 主机名: ubuntu-server # IP地址: 192.168.1.100

避坑指南

  • 如果系统卡在启动画面,请检查/etc/rc.local末尾是否有exit 0
  • 长时间运行的脚本(如Python服务)务必加&放到后台,否则会阻塞整个启动流程
  • 所有路径必须用绝对路径,~在rc.local中不生效

3. systemd系统服务方案:生产环境首选

当你需要服务具备“开机即运行、崩溃自动重启、状态随时查询”能力时,systemd是唯一选择。它比rc.local更健壮,也比旧式init.d更现代。

3.1 创建服务定义文件

/etc/systemd/system/下创建服务文件(需root权限):

sudo nano /etc/systemd/system/my-monitor.service

内容如下(请根据实际路径修改):

[Unit] Description=系统监控服务 After=network.target StartLimitIntervalSec=0 [Service] Type=simple User=ubuntu WorkingDirectory=/home/ubuntu/monitor ExecStart=/usr/bin/python3 /home/ubuntu/monitor/main.py Restart=always RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target

参数说明

  • After=network.target:确保网络就绪后再启动
  • Restart=always:进程退出后自动重启(防崩溃)
  • User=ubuntu:以普通用户身份运行,更安全
  • StandardOutput=journal:日志统一由systemd管理,方便排查

3.2 启用并启动服务

# 重新加载配置 sudo systemctl daemon-reload # 启用开机自启 sudo systemctl enable my-monitor.service # 立即启动(不需重启) sudo systemctl start my-monitor.service # 查看实时日志 sudo journalctl -u my-monitor.service -f

如果服务启动失败,用这条命令精准定位问题:

# 查看最近10条错误日志 sudo journalctl -u my-monitor.service --since "1 hour ago" | grep -i "error\|fail"

3.3 进阶技巧:按需启动与环境变量

很多脚本依赖环境变量(如PATH、PYTHONPATH),systemd默认不继承shell环境。解决方案:

# 在[Service]段添加 Environment="PATH=/usr/local/bin:/usr/bin:/bin" Environment="PYTHONPATH=/home/ubuntu/monitor/lib"

或者更优雅的方式——用ExecStartPre预处理:

[Service] ExecStartPre=/bin/sh -c 'source /home/ubuntu/.bashrc && export PATH' ExecStart=/usr/bin/python3 /home/ubuntu/monitor/main.py

4. systemd用户服务方案:桌面用户的最佳实践

如果你只是想让某个GUI程序(比如自动同步网盘、定时截图工具)在登录后自动运行,完全没必要动系统级服务——用户级service更安全、更灵活。

4.1 创建用户服务文件

注意路径是~/.config/systemd/user/(当前用户目录):

mkdir -p ~/.config/systemd/user nano ~/.config/systemd/user/auto-screenshot.service

内容如下:

[Unit] Description=自动截图服务 After=graphical-session.target [Service] Type=oneshot ExecStart=/usr/bin/gnome-screenshot -d 5 -p RemainAfterExit=yes [Install] WantedBy=default.target

4.2 启用用户服务

# 重新加载用户级配置 systemctl --user daemon-reload # 启用开机自启(登录时启动) systemctl --user enable auto-screenshot.service # 立即运行一次 systemctl --user start auto-screenshot.service

重要提示:用户级服务默认在用户登出后停止。如需保持运行(如后台下载),将Type改为simple并添加Restart=on-failure

5. 故障排查:90%的问题都出在这几个地方

即使严格按照步骤操作,仍可能遇到启动失败。以下是高频问题清单及解决方法:

5.1 脚本找不到命令(Command not found)

现象:日志中出现/bin/bash: python3: command not found
原因:systemd使用精简PATH,不包含/usr/local/bin等路径
解决:在service文件中显式声明PATH,或用绝对路径调用命令

Environment="PATH=/usr/local/bin:/usr/bin:/bin" # 或直接写 ExecStart=/usr/bin/python3 /path/to/script.py

5.2 权限被拒绝(Permission denied)

现象Failed to start: Permission denied
原因:脚本无执行权限,或systemd无法访问目标路径
解决

# 确保脚本可执行 chmod +x /path/to/your/script.sh # 确保目录权限允许systemd读取 sudo chown -R $USER:$USER /path/to/script/

5.3 服务启动超时(Timeout)

现象start operation timed out
原因:脚本启动慢,systemd默认等待90秒
解决:在service文件中增加超时设置

[Service] TimeoutStartSec=300 # 改为300秒

5.4 图形界面相关服务启动失败

现象:GUI程序启动报错Cannot open display
原因:用户服务未获取到X11会话环境
解决:在service文件中添加环境变量

[Service] Environment="DISPLAY=:0" Environment="XAUTHORITY=/home/youruser/.Xauthority"

6. 总结:按需选择,少即是多

回顾这三种方案,没有“最好”,只有“最合适”:

  • rc.local是你的“快速原型工具”——5分钟验证想法,适合临时任务和硬件初始化;
  • systemd系统服务是你的“生产环境基石”——状态可控、日志统一、崩溃自愈,适合长期运行的关键服务;
  • systemd用户服务是你的“桌面效率助手”——无需root、权限隔离、登录即用,适合个人工作流自动化。

最后送你一条经验法则:新项目一律从systemd系统服务开始。虽然初期多写几行配置,但后期省下的调试时间远超预期。而rc.local,就让它安静地躺在你的调试工具箱里,当需要快速验证一个硬件引脚状态时,再把它请出来。

--- > **获取更多AI镜像** > > 想探索更多AI镜像和应用场景?访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_source=mirror_blog_end),提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询