零基础教程:用测试镜像快速设置Ubuntu开机自启
你刚部署完“测试开机启动脚本”这个镜像,想让自己的程序一开机就自动运行,但又没碰过Linux系统?别担心——这篇教程专为零基础用户设计。不需要懂systemd原理,不用查文档翻报错,只要按顺序敲几条命令,就能亲眼看到你的脚本在重启后稳稳跑起来。
整个过程只需要10分钟,连虚拟机都不用关机重装。我们不讲“服务单元”“依赖关系”“目标target”,只说“你该点哪里、输什么、看哪行字说明成功了”。最后还会告诉你,如果哪一步卡住了,怎么一眼看出问题在哪。
1. 先确认你的系统环境
1.1 检查Ubuntu版本和是否已启用systemd
打开终端(快捷键Ctrl + Alt + T),输入:
lsb_release -a你会看到类似这样的输出:
Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy只要显示的是Ubuntu 18.04 及以上版本(比如 20.04、22.04、24.04),本教程完全适用。这些版本默认使用 systemd 管理启动流程,而我们正是要借助它来“唤醒”传统上大家熟悉的/etc/rc.local方式。
小提示:Ubuntu 14.04 及更早版本可以直接编辑
/etc/rc.local启动脚本,但新版本默认禁用了它。这不是bug,是设计变更——而我们接下来的操作,就是把它“安全地重新打开”。
2. 创建rc-local.service服务文件
这一步相当于给系统加一个“翻译官”:告诉 systemd,“当系统启动到多用户模式时,请帮我执行/etc/rc.local这个老朋友”。
2.1 新建服务配置文件
在终端中输入:
sudo nano /etc/systemd/system/rc-local.service推荐用
nano而不是vim,因为它是新手友好的文本编辑器,没有模式切换烦恼,按Ctrl+O保存,Ctrl+X退出。
把下面这段内容完整复制粘贴进去(注意大小写和空格):
[Unit] Description=/etc/rc.local Compatibility ConditionPathExists=/etc/rc.local [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes SysVStartPriority=99 [Install] WantedBy=multi-user.target保存并退出(Ctrl+O→ 回车 →Ctrl+X)。
2.2 验证文件是否创建成功
输入以下命令查看文件是否存在且内容无误:
sudo cat /etc/systemd/system/rc-local.service | head -n 5你应该能看到前5行内容,比如[Unit]、Description=等。如果提示“No such file”,请回头检查路径和拼写。
3. 创建并配置/etc/rc.local启动脚本
现在,我们来准备那个真正干活的“启动索引文件”——/etc/rc.local。它本身不直接写业务逻辑,而是作为“总指挥”,负责调用你自己的脚本(比如test.sh)。
3.1 创建rc.local文件
在终端中输入:
sudo nano /etc/rc.local粘贴以下内容(这是标准模板,已适配新版Ubuntu):
#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. echo "看到这行字,说明添加自启动脚本成功。" > /usr/local/test.log exit 0保存退出(Ctrl+O→ 回车 →Ctrl+X)。
3.2 给它加上可执行权限
这条命令很关键,否则系统会跳过它:
sudo chmod +x /etc/rc.local权限解释:
+x表示“允许执行”,就像给Windows里的.exe文件加运行属性一样。没有这步,rc.local就是一堆纯文本,systemd 看都不会看。
4. 启用并启动rc-local服务
现在,systemd 已经知道有这么个服务,我们也准备好了它的“台词”(rc.local),接下来就是正式“上台演出”。
4.1 启用服务(开机自动加载)
sudo systemctl enable rc-local你会看到输出类似:
Created symlink /etc/systemd/system/multi-user.target.wants/rc-local.service → /etc/systemd/system/rc-local.service.这表示设置成功:下次开机时,systemd 会自动加载并运行它。
4.2 立即启动服务(不需重启)
sudo systemctl start rc-local.service4.3 检查服务状态
sudo systemctl status rc-local.service重点看倒数两行:
- 如果显示
active (exited)或active (running),并且没有红色failed字样,说明服务已正常运行; - 如果显示
inactive (dead)或failed,请先别慌,记下最后一行的错误提示(比如Failed with result 'exit-code'),我们后面统一排查。
小技巧:按
q键可退出状态页面,回到命令行。
5. 验证是否生效:检查日志文件
我们之前在rc.local里写了这样一行:
echo "看到这行字,说明添加自启动脚本成功。" > /usr/local/test.log它会在服务启动时,往/usr/local/test.log写入一句话。现在我们就去读它:
cat /usr/local/test.log如果输出:
看到这行字,说明添加自启动脚本成功。恭喜!你的开机自启通道已经打通。哪怕现在立刻重启,这句话也会再次出现。
6. 把你的程序加进去:以Python脚本为例
前面只是“通路测试”,现在我们来接入真实业务。假设你想开机自动运行一个叫ce.py的Python程序,它会生成一个sb.txt文件。
6.1 创建测试Python脚本
在终端中输入:
nano ~/ce.py粘贴以下内容:
with open("/home/$USER/sb.txt", "w") as f: f.write("SB")注意:这里用了
$USER变量,确保路径指向当前登录用户的家目录,避免硬编码用户名出错。
保存退出(Ctrl+O→ 回车 →Ctrl+X)。
6.2 创建调用它的Shell脚本
nano ~/test.sh写入:
#!/bin/bash cd /home/$USER python3 ce.py exit 0保存退出。
6.3 给Shell脚本加执行权限
chmod +x ~/test.sh6.4 修改rc.local,让它调用test.sh
sudo nano /etc/rc.local把原来那行echo ...删除或注释掉(在前面加#),替换成:
# 启动我的Python程序 /home/$USER/test.sh exit 0注意:exit 0必须保留在文件末尾,这是告诉系统“本脚本执行成功”。
保存退出。
7. 最终验证与常见问题排查
7.1 重启前快速测试
不用等重启,先手动运行一遍,确认路径和权限都没问题:
sudo /etc/rc.local然后检查:
cat ~/sb.txt应该输出SB。如果报错,大概率是路径写错、权限没加、或Python没找到(试试把python3改成python或/usr/bin/python3)。
7.2 重启并最终确认
sudo reboot等待系统重启登录后,立即执行:
cat ~/sb.txt看到SB,说明你的程序真的实现了开机自启。
8. 常见失败原因与解决方法
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
systemctl status rc-local.service显示failed | rc.local文件没有+x权限 | 再执行一次sudo chmod +x /etc/rc.local |
| 日志文件没生成,或内容为空 | rc.local里漏写了exit 0,或某行命令出错中断 | 打开/etc/rc.local,确认末尾是exit 0;把所有命令前加set -x开启调试(临时) |
test.sh运行报错command not found: python | 系统找不到python命令 | 在test.sh中用绝对路径,如/usr/bin/python3 |
sb.txt生成在 root 目录下,而不是你的家目录 | 脚本中用了~或未展开$USER | 统一用/home/用户名/或保持cd /home/$USER后再操作 |
| 中文字符导致脚本崩溃 | Python文件含中文注释但未声明编码 | 在ce.py第一行加# -*- coding: utf-8 -*- |
快速定位问题:任何时候遇到失败,都先运行
sudo systemctl status rc-local.service,它会显示最后一次执行的完整错误日志,比猜强一百倍。
9. 总结:你已经掌握的核心能力
1. 你学会了如何绕过Ubuntu新版对rc.local的限制
通过创建rc-local.service,你让这个经典机制重新可用,无需深入理解systemd内部结构。
2. 你掌握了“启动索引”的工程化思路
不把业务逻辑硬塞进rc.local,而是用它统一调度多个.sh脚本,未来加新任务只需新增脚本+一行调用。
3. 你拥有了可复用的排错路径
从systemctl status查日志,到手动执行验证,再到权限/路径/编码三板斧,下次遇到任何自启问题,你都有清晰抓手。
4. 你完成了从“能跑”到“真用”的跨越
不再停留在打印一句“成功”,而是让自己的Python程序稳稳落地,开机即服务。
下一步,你可以尝试:把test.sh改成启动Web服务、定时同步数据、或监控硬件温度——只要它是一个能用Shell调用的程序,这套方法就完全适用。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。