小白也能学会的Ubuntu开机启动脚本设置完整教程
你是不是也遇到过这样的问题:写好了一个监控程序、一个数据采集脚本,或者一个自动备份工具,每次重启电脑后都要手动打开终端、切换路径、再敲一遍./run.sh?太麻烦了!更糟的是,有时候忘了这一步,关键任务就断掉了。
别担心——这篇教程就是为你准备的。不需要懂 systemd、不用背复杂命令、不涉及晦涩概念。只要你会用鼠标新建文件、会复制粘贴几行代码、知道怎么在终端里输入命令,就能让脚本在 Ubuntu 开机时自动运行,就像系统自带的服务一样可靠。
本文全程基于真实操作验证,适配 Ubuntu 20.04、22.04、24.04 等主流版本(包括默认不带/etc/rc.local的新系统),覆盖两种最稳妥的方法:传统rc.local方式和通用profile补充方式。每一步都配有清晰说明、可直接复制的命令,以及常见卡点的解决提示。哪怕你是第一次接触 Linux,也能照着做完。
1. 先搞清楚:我们要实现什么效果
开机启动脚本,说白了就是让系统在完成初始化、桌面加载完成前,悄悄帮你执行一段你写好的命令。比如:
- 自动启动一个 Python 数据监听服务
- 每次开机把日志清空并创建新记录文件
- 启动一个本地 Web 服务供局域网访问
- 运行一个硬件检测脚本并保存结果
它不是“一开机就弹窗”,而是安静地在后台运行,不打扰你使用电脑。而我们今天要做的,就是一个最基础但最典型的例子:开机自动生成一个带时间戳的文本文件,并写入一句问候语。
这个小任务看似简单,但它包含了所有核心环节:脚本编写、权限设置、系统级调用、路径处理、错误检查。学会了它,你就能举一反三,部署任何你想自动运行的程序。
2. 第一步:写一个能跑起来的脚本
别被“脚本”吓到——它其实就是一个纯文本文件,里面写的是你平时在终端里敲的命令。
2.1 创建脚本文件
我们把它放在一个干净、易找的位置:你的主目录下的scripts文件夹。
打开终端(快捷键Ctrl+Alt+T),依次输入以下三条命令:
mkdir -p ~/scripts cd ~/scripts nano auto_start_demo.sh小提示:
nano是 Ubuntu 自带的简易文本编辑器,比vim更友好。如果提示Command 'nano' not found,先运行sudo apt update && sudo apt install nano -y安装即可。
这时会进入编辑界面。请逐字准确输入以下内容(注意标点符号和空格):
#!/bin/bash # 获取当前时间,格式为 年-月-日_时:分:秒 TIMESTAMP=$(date +"%Y-%m-%d_%H:%M:%S") # 在脚本所在目录下生成 output.txt,并写入问候语和时间 echo "Hello! This script ran at: $TIMESTAMP" > ./output.txt # 可选:再写一行到另一个文件,方便验证是否真执行了 echo "Startup completed successfully." > ./startup_log.txt输入完成后,按Ctrl+O(字母 O,不是零)保存,回车确认文件名,再按Ctrl+X退出编辑器。
现在你就在~/scripts/目录下有了一个叫auto_start_demo.sh的脚本文件。
2.2 给脚本加上“可执行”权限
Linux 默认不会运行.sh文件,必须明确告诉系统:“这个文件可以当程序来跑”。
回到终端,确保你在~/scripts目录下(可以用pwd命令确认),然后输入:
chmod +x auto_start_demo.sh这条命令的意思是:“给这个文件加上‘执行’权限”。它比chmod 777更安全、更规范,是推荐做法。
2.3 手动测试一下:确保脚本能独立运行
别急着塞进系统启动流程,先验证它本身没问题:
./auto_start_demo.sh回车后,如果没有报错,就说明成功了。接着检查是否生成了文件:
ls -l *.txt cat output.txt你应该看到类似这样的输出:
Hello! This script ran at: 2024-06-15_14:28:03如果一切正常,恭喜你——脚本部分已经搞定。接下来就是让它“开机自动跑”。
3. 方法一:通过/etc/rc.local设置(推荐给大多数用户)
这是最经典、最直观的方式,适用于绝大多数 Ubuntu 桌面版。它的特点是:系统启动后期、用户登录前执行,适合需要访问硬件或网络的服务类脚本。
3.1 检查系统是否支持 rc.local
不是所有新版 Ubuntu 都默认启用rc.local。我们先确认一下:
ls -l /etc/rc.local- 如果显示
No such file or directory→ 说明系统没这个文件,需要手动创建(见 3.2) - 如果显示权限为
-rwxr-xr-x或类似可执行权限 → 可直接跳到 3.3 - 如果显示权限是
-rw-r--r--(不可执行)→ 需要先加权限(见 3.3)
3.2 创建并启用 rc.local(适用于缺失该文件的系统)
依次执行以下命令:
sudo nano /etc/rc.local在打开的空白文件中,完整粘贴以下内容(注意:第一行#!/bin/bash和最后一行exit 0缺一不可):
#!/bin/bash # 这是系统级启动脚本,会在多用户模式下最后执行 # 所有命令都会以 root 权限运行,请谨慎填写 # 切换到你的脚本所在目录 cd /home/$SUDO_USER/scripts # 执行你的脚本(注意:这里用 su 切换回普通用户,避免权限过高出错) su $SUDO_USER -c "./auto_start_demo.sh" exit 0关键说明:
$SUDO_USER是一个变量,会自动替换成你当前登录的用户名(比如ubuntu),所以这段脚本在任何人的电脑上都能通用;- 使用
su $SUDO_USER -c "..."是为了防止脚本以 root 身份运行时,因路径或权限问题失败(例如写入文件到/home/ubuntu/下);exit 0表示“执行成功”,少了它,系统可能认为启动异常而中断后续流程。
保存并退出(Ctrl+O→ 回车 →Ctrl+X)。
然后赋予可执行权限:
sudo chmod +x /etc/rc.local3.3 修改已有 rc.local(适用于已存在但不可执行的系统)
如果你之前ls -l /etc/rc.local看到的是普通文件(无x权限),只需两步:
sudo chmod +x /etc/rc.local sudo nano /etc/rc.local在exit 0之前,添加这两行(位置很重要!必须在exit 0上方):
cd /home/$SUDO_USER/scripts su $SUDO_USER -c "./auto_start_demo.sh"保存退出即可。
4. 方法二:通过/etc/profile补充(兼容性最强的备选方案)
如果rc.local方式在你机器上不起作用(比如某些云服务器镜像或极简安装版),或者你希望脚本在用户登录后立即运行(比如要启动图形界面程序),那就用这个方法。
它不依赖任何服务,只修改一个全局配置文件,所有用户登录时都会读取,稳定且几乎 100% 有效。
4.1 编辑 profile 文件
sudo nano /etc/profile把光标移到文件最底部,另起一行,粘贴以下内容:
# 开机启动脚本:auto_start_demo.sh if [ -x "/home/$USER/scripts/auto_start_demo.sh" ]; then /home/$USER/scripts/auto_start_demo.sh >/dev/null 2>&1 & fi解释:
[ -x "..."]是判断脚本是否存在且有执行权限;>/dev/null 2>&1表示把脚本输出(包括错误)全部丢弃,避免登录时刷屏;&表示后台运行,不阻塞终端登录;$USER是当前登录用户的变量,比硬编码用户名更安全。
保存退出。
5. 验证与排错:重启前必做的三件事
别急着sudo reboot。先做这几步检查,能省下你重启三次的时间。
5.1 检查路径和权限是否全部正确
运行以下命令,逐项核对输出是否匹配:
# 1. 确认脚本存在且可执行 ls -l ~/scripts/auto_start_demo.sh # 2. 确认 rc.local 存在且可执行(如果用了方法一) ls -l /etc/rc.local # 3. 确认 profile 中追加的内容已生效(如果用了方法二) sudo tail -n 5 /etc/profile预期输出中应包含x(执行权限)和你刚添加的路径。
5.2 模拟启动流程,手动触发一次
不用重启,也能测试效果:
# 模拟 rc.local 方式(需 root) sudo /etc/rc.local # 或模拟 profile 方式(当前用户) source /etc/profile然后检查:
ls -l ~/scripts/*.txt cat ~/scripts/output.txt如果文件已更新、时间戳是最新,说明逻辑完全通了。
5.3 常见问题速查表
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 重启后没生成文件 | 脚本路径写错(如用了~而不是/home/用户名) | 改成绝对路径/home/yourname/scripts/... |
提示Permission denied | 忘了chmod +x,或rc.local没加执行权限 | 补上sudo chmod +x ... |
| 文件生成了但内容为空 | 脚本里用了相对路径(如./output.txt),但执行环境不同 | 改成绝对路径:/home/yourname/scripts/output.txt |
| 登录后终端卡住几秒 | profile中脚本没加&后台运行 | 在命令末尾补上& |
rc.local不生效 | Ubuntu 版本较新,默认禁用该服务 | 运行sudo systemctl enable rc-local启用服务 |
6. 进阶建议:让脚本更健壮、更实用
你现在已掌握核心能力。下面几个小技巧,能帮你把脚本从“能用”升级为“好用”“长期可用”。
6.1 加个日志记录,出问题一眼定位
在脚本开头加上:
exec >> /home/$USER/scripts/startup.log 2>&1 echo "=== $(date) ==="这样每次运行的全部输出(包括错误)都会追加到startup.log,再也不用盲猜哪里错了。
6.2 避免重复执行:加个锁文件机制
如果你的脚本运行时间较长(比如启动一个服务),可以防止系统误判为失败而多次调用:
LOCKFILE="/home/$USER/scripts/.startup_lock" if [ -f "$LOCKFILE" ]; then echo "Script already running." exit 0 fi touch "$LOCKFILE" # ... 你的主逻辑放在这里 ... rm -f "$LOCKFILE"6.3 想启动图形程序?加个 DISPLAY 环境变量
比如你要开机自动打开一个浏览器页面:
export DISPLAY=:0 export XAUTHORITY=/home/$USER/.Xauthority su $USER -c "firefox https://example.com &"注意:必须在
su切换用户后设置,否则无效。
7. 总结:你已经掌握了 Ubuntu 开机启动的核心能力
回顾一下,我们完成了什么:
- 写了一个功能清晰、带时间戳的启动脚本
- 学会了两种主流开机启动方式:
rc.local(系统级)和/etc/profile(用户级) - 掌握了权限设置、路径处理、变量使用等关键细节
- 学会了快速验证、模拟测试和常见问题排查
- 还拿到了三个实用进阶技巧:日志记录、防重入锁、图形界面支持
这不是一个“一次性教程”,而是一套可复用的方法论。以后你想开机启动 Python 服务、Node.js 应用、Docker 容器,甚至一个自定义的 GUI 工具,只需要把./auto_start_demo.sh里的几行命令,替换成你的真实启动命令即可。
真正的 Linux 自动化,就从这一小步开始。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。