一键配置开机运行.sh文件,再也不用手动操作
你是不是也遇到过这样的情况:每次重启电脑后,都要手动打开终端、切换到脚本目录、再执行一遍./xxx.sh?重复操作不仅费时,还容易忘记——尤其当你依赖这个脚本启动关键服务、同步数据、或初始化开发环境时,一次遗漏就可能导致整个工作流中断。
别担心,这不是你的问题,而是没用对方法。Linux 系统本身提供了多种可靠的开机自启机制,其中最轻量、最稳定、也最适合个人开发者和测试场景的方案,就是通过rc.local实现脚本自动执行。它不需要改写 systemd 单元、不涉及复杂权限管理,更不会因为系统升级突然失效。只要脚本本身能跑通,加进rc.local就能稳稳运行。
本文将带你从零开始,真正实现“一键配置”:不绕弯、不踩坑、不查文档二次确认。我们会用一个真实可用的测试镜像(名称为“测试开机启动脚本”)作为实操载体,完整走通创建脚本 → 授权 → 注册 → 验证全流程。所有命令可直接复制粘贴,每一步都附带清晰说明和避坑提示。哪怕你刚接触 Linux 终端,也能在 5 分钟内搞定。
1. 先确认系统是否支持 rc.local
不是所有 Ubuntu 版本默认启用rc.local,尤其是 18.04 及之后的桌面版,虽然文件存在,但服务可能被禁用。所以第一步不是写脚本,而是确认基础环境是否就绪。
打开终端,输入:
systemctl status rc-local如果看到类似active (exited)的状态,说明已启用,可以跳过本节;
如果显示inactive (dead)或报错Unit rc-local.service not found,请继续执行以下两步修复:
1.1 创建并启用 rc-local 服务
先检查/etc/systemd/system/rc-local.service是否存在:
ls /etc/systemd/system/rc-local.service若提示No such file or directory,说明需要手动创建。执行以下命令:
sudo tee /etc/systemd/system/rc-local.service << 'EOF' [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 EOF然后创建空的/etc/rc.local文件,并赋予可执行权限:
sudo touch /etc/rc.local sudo chmod +x /etc/rc.local最后启用服务:
sudo systemctl enable rc-local sudo systemctl start rc-local再次运行systemctl status rc-local,应显示active (exited)。
这一步只需做一次,后续所有开机脚本都基于此服务运行。
2. 编写你的开机脚本(.sh 文件)
脚本内容完全由你控制,但有三个关键原则必须遵守:路径明确、权限正确、退出可靠。我们以镜像名称“测试开机启动脚本”对应的典型需求为例——比如启动一个模拟器、记录日志、或进入指定目录执行任务。
2.1 创建脚本文件
推荐统一放在~/scripts目录下(即当前用户的主目录下的 scripts 文件夹),便于管理和备份:
mkdir -p ~/scripts nano ~/scripts/auto_run_test.sh提示:
nano比vim更友好,新手按Ctrl+O保存,Ctrl+X退出。
在编辑器中输入以下内容(注意:第一行必须是#!/bin/bash,且不能有多余空格):
#!/bin/bash # 记录启动时间,用于验证是否真正执行 echo "[$(date '+%Y-%m-%d %H:%M:%S')] System booted and script started" >> /home/$USER/startup_log.txt # 示例1:创建一个测试输出文件 echo "helloStartup" > /home/$USER/output.txt # 示例2:切换到指定目录并运行程序(请按实际路径修改) # cd /home/$USER/mywbc_v5_usb/build # ./sim/sim # 示例3:启动一个后台服务(如 Python Web 服务) # nohup python3 /home/$USER/myapp/app.py > /home/$USER/app.log 2>&1 & # 必须添加这一行,确保脚本正常退出 exit 0重点说明:
#!/bin/bash是解释器声明,必须顶格、无空格、无 BOM,否则脚本无法识别;- 使用
$USER而非硬编码用户名(如user),保证脚本在任意用户下都可复用; - 所有路径使用绝对路径,避免因开机时工作目录不确定导致失败;
exit 0是收尾标准动作,告诉系统“执行成功”,缺了可能导致rc.local后续命令不执行;- 注释行(
#开头)不影响运行,建议保留,方便日后维护。
2.2 设置脚本执行权限
仅保存文件还不够,Linux 默认禁止.sh文件直接执行。需显式授权:
chmod +x ~/scripts/auto_run_test.sh验证是否成功:
输入ls -l ~/scripts/auto_run_test.sh,若看到-rwxr-xr-x(其中x表示可执行),说明权限已生效。
3. 将脚本注册为开机任务
现在脚本已就绪,下一步是让它在每次开机时自动运行。我们通过修改/etc/rc.local实现——这是 Linux 传统且兼容性最强的方式。
3.1 编辑 rc.local 文件
sudo nano /etc/rc.local文件默认内容类似这样(不同版本略有差异):
#!/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.你需要在# By default this script does nothing.这一行之后、exit 0之前,插入你的脚本调用命令。推荐写法如下:
# Start custom startup script cd /home/$USER/scripts ./auto_run_test.sh注意事项:
- 不要用
sudo sh auto_run_test.sh——rc.local本身以 root 权限运行,无需再 sudo; cd切换路径后再执行,比写绝对路径更清晰、更易维护;- 务必确保
exit 0仍在文件末尾,且是最后一行(前面不能有空行)。
保存并退出(Ctrl+O→Enter→Ctrl+X)。
3.2 验证 rc.local 文件格式
执行以下命令检查语法是否合法:
sudo /etc/rc.local如果没有任何报错,且看到startup_log.txt或output.txt已生成,说明配置正确。
如果有报错(如Permission denied或No such file),请回头检查路径、权限、#!/bin/bash是否写错。
4. 测试与验证:不重启也能快速确认
很多人误以为必须重启才能验证,其实大可不必。rc.local本质就是一个 shell 脚本,我们可以手动模拟开机执行流程,快速定位问题。
4.1 手动触发一次
sudo /etc/rc.local等待几秒后,检查结果:
cat /home/$USER/startup_log.txt cat /home/$USER/output.txt如果看到时间戳和"helloStartup",说明脚本已能正常运行
如果报错,请根据错误信息精准修正(常见问题见第 5 节)。
4.2 检查日志确认执行时机
rc.local在多用户模式末尾执行,可通过 journalctl 查看其运行记录:
sudo journalctl -u rc-local --since "1 hour ago" | grep -i "auto_run"若看到类似Started /etc/rc.local Compatibility和脚本输出,证明它确实在开机阶段被调用。
5. 常见问题与解决方案(真实踩坑总结)
在上百次实测中,以下问题是新手最高频的“卡点”,我们为你提前打包解决:
| 问题现象 | 根本原因 | 一招解决 |
|---|---|---|
脚本不执行,startup_log.txt为空 | rc.local中缺少exit 0,或位置不对 | 打开/etc/rc.local,确认exit 0是倒数第二行,且前面无空行 |
报错Permission denied | 脚本文件未加+x权限,或rc.local自身无执行权 | sudo chmod +x /etc/rc.local+chmod +x ~/scripts/auto_run_test.sh |
脚本执行了,但cd切换失败或程序找不到 | 使用了相对路径(如./sim/sim),而rc.local当前目录是/ | 全部改用绝对路径,例如/home/$USER/mywbc_v5_usb/build/sim/sim |
output.txt生成了,但内容为空或乱码 | 脚本中用了中文引号“”而非英文引号"" | 全部替换为英文标点,Linux 不识别中文符号 |
| 重启后仍不生效 | rc-local服务未启用,或 Ubuntu 版本禁用了该服务 | 执行sudo systemctl enable --now rc-local强制启用 |
额外提醒:如果你的脚本需要访问图形界面(如弹窗、打开浏览器),rc.local无法满足——它运行在无图形会话的后台。此时应改用用户级 autostart(如~/.config/autostart/),但本文聚焦“纯终端任务”,不展开。
6. 更轻量的备选方案:追加到 /etc/profile(适合单用户简单任务)
如果只是想让某个命令在每次登录终端时自动运行(比如设置环境变量、启动代理),且你只用一个用户、不依赖 root 权限,那么修改/etc/profile是更简单的选择。
注意:
/etc/profile影响所有用户,如只为当前用户,请改用~/.bashrc。
执行:
echo "# Auto-run on login" | sudo tee -a /etc/profile echo "cd ~/scripts && ./auto_run_test.sh" | sudo tee -a /etc/profile这样,每次你打开新终端窗口,脚本就会自动执行。但它不是真正的“开机启动”(不随系统启动,只随终端登录),适合调试阶段快速验证逻辑。
7. 总结:你已经掌握的不仅是脚本,更是自动化思维
回顾整个过程,你其实完成了一次典型的 Linux 自动化闭环:
- 定义目标:让
.sh文件开机自动运行; - 选择工具:
rc.local—— 简单、稳定、跨版本兼容; - 编写脚本:遵循路径、权限、退出三原则;
- 注册任务:通过标准系统服务注入;
- 验证闭环:不依赖重启,手动触发即可确认效果。
这背后的能力,远不止于“省一次手动点击”。它意味着你可以把重复性操作封装成可复用的单元,把环境初始化变成一键交付,把故障恢复变成自动重试。无论是部署 AI 镜像、启动本地大模型服务,还是定时拉取训练数据,这套方法论都通用。
现在,你的“测试开机启动脚本”镜像已经准备就绪。下次重启,它会安静地在后台完成所有设定——而你,只需要打开终端,查看output.txt,然后喝一口咖啡。
--- > **获取更多AI镜像** > > 想探索更多AI镜像和应用场景?访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_source=mirror_blog_end),提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。