适合新手的开机启动方案,无需深入systemd
对于刚接触 Linux 系统管理的新手来说,设置一个脚本在开机时自动运行听起来像是必须掌握systemd或编写复杂服务文件的任务。但其实,在大多数常见的 Ubuntu 和 Debian 系列发行版中,有一种更简单、直观且不需要理解底层服务机制的方法——利用系统自带的启动执行入口,比如rc.local。
本文将带你一步步完成一个无需了解 systemd 原理的开机启动方案,使用一个简单的 Shell 脚本作为示例,确保你在不深入系统细节的前提下,也能让自定义任务随系统启动自动运行。整个过程清晰明了,适合所有刚入门 Linux 的用户。
1. 创建你的启动脚本
首先,我们需要准备一个 Shell 脚本,它将在每次开机时被执行。你可以把它放在任意位置,但为了便于管理,建议放在一个固定的目录下,例如~/Documents/scripts/。
1.1 创建脚本目录和文件
打开终端,输入以下命令创建目录并进入:
mkdir -p ~/Documents/scripts cd ~/Documents/scripts然后创建脚本文件:
nano auto_run_test.sh1.2 编写脚本内容
在编辑器中输入如下内容:
#!/bin/bash echo "helloStartup" > ./output.txt cd /home/user/mywbc_v5_usb/build echo "EnterBuildDir" > ./output.txt ./sim/sim echo "AfterSim" > ./outputend.txt说明:
#!/bin/bash:这是脚本的“声明行”,告诉系统用 Bash 解释器来执行这个文件。- 后续命令是你希望开机后自动执行的操作。上面的例子包括写入日志、切换目录、运行模拟程序等。
- 注意路径要根据你实际的用户名和项目路径进行修改,尤其是
/home/user/...这部分。
保存并退出(在 nano 中按Ctrl+O回车保存,Ctrl+X退出)。
2. 给脚本添加执行权限
Linux 默认不会执行没有权限的脚本。所以我们需要给它加上可执行权限。
运行以下命令:
chmod +x auto_run_test.sh提示:虽然有些教程使用
chmod 777来赋予全部权限,但这存在安全风险。普通情况下只需+x(即chmod 755)就足够了。
验证是否成功:
ls -l auto_run_test.sh你应该能看到类似-rwxr-xr-x的权限标识,表示已可执行。
3. 使用 rc.local 实现开机启动
Ubuntu 等基于 SysVinit 遗留机制的系统提供了一个名为rc.local的传统启动脚本,它会在系统初始化完成后最后执行一次。我们可以通过修改它来加入我们的自定义脚本调用。
3.1 检查 rc.local 是否存在
先确认/etc/rc.local文件是否存在:
ls /etc/rc.local如果提示“No such file or directory”,说明该文件未创建,需手动建立(见第5节备选方案)。如果存在,则继续下一步。
3.2 修改 rc.local 文件权限
默认情况下,/etc/rc.local可能是只读的,我们需要临时赋予写权限:
sudo chmod +w /etc/rc.local这比chmod 777更安全,仅添加写权限而不改变其他设置。
3.3 编辑 rc.local 内容
使用文本编辑器打开:
sudo nano /etc/rc.local确保文件以#!/bin/sh -e开头,并在exit 0之前插入以下两行:
cd /home/user/Documents/scripts sh auto_run_test.sh完整示例如下:
#!/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. cd /home/user/Documents/scripts sh auto_run_test.sh exit 0关键点说明:
- 必须确保
exit 0是最后一行,否则可能导致系统启动卡住。 - 使用
sh而不是sudo sh,因为rc.local本身是以 root 权限运行的。 - 路径中的
user需替换为你的实际用户名。
保存并退出编辑器。
3.4 设置 rc.local 为可执行
为了让系统真正执行这个脚本,还需将其设为可执行:
sudo chmod +x /etc/rc.local4. 测试与验证
现在一切就绪,我们可以重启系统来测试效果。
sudo reboot重启完成后,检查脚本是否执行成功:
cat ~/Documents/scripts/output.txt cat ~/Documents/scripts/outputend.txt如果你看到输出了"helloStartup"、"EnterBuildDir"和"AfterSim",那就说明脚本已经成功在开机时运行!
此外,也可以通过查看进程或日志进一步确认:
ps aux | grep sim看是否有sim/sim程序正在运行。
5. 备选方案:当系统没有 rc.local 时怎么办?
某些新版 Ubuntu(如 20.04 及以后)默认不再包含rc.local文件。但我们仍然可以手动创建它,并启用其功能。
5.1 手动创建 rc.local 文件
sudo nano /etc/rc.local写入以下内容:
#!/bin/sh -e # 自定义开机脚本 cd /home/user/Documents/scripts sh auto_run_test.sh exit 0保存后设置权限:
sudo chmod +x /etc/rc.local5.2 启用 rc-local.service
现代 Ubuntu 使用 systemd,因此需要确保有一个对应的服务单元来加载rc.local。
检查是否存在rc-local.service:
systemctl status rc-local如果没有启用,可以创建或激活它。
通常情况下,标准镜像中已有该服务模板。只需启用即可:
sudo systemctl enable rc-local然后启动服务进行测试(无需重启):
sudo systemctl start rc-local查看状态确认是否成功:
sudo systemctl status rc-local如果显示active (exited),说明已正常运行。
6. 替代方法:追加到 /etc/profile(适用于 GUI 登录场景)
如果你发现rc.local方法仍不可行,或者你希望脚本在用户登录后才运行(例如涉及图形界面或桌面环境的任务),可以考虑将命令追加到/etc/profile。
注意:这种方法只在用户登录终端时触发,不适合后台守护任务。
编辑文件:
sudo nano /etc/profile滚动到底部,添加:
if [ "$USER" = "user" ]; then cd /home/user/Documents/scripts sh auto_run_test.sh fi保存退出。下次用户登录时,脚本就会自动执行。
7. 常见问题与解决建议
7.1 脚本没执行?检查这些地方
| 问题 | 检查项 |
|---|---|
| 路径错误 | 确保脚本中所有路径都是绝对路径或正确切换了目录 |
| 权限不足 | 确认auto_run_test.sh和rc.local都有可执行权限 |
| exit 0 缺失 | rc.local最后一行必须是exit 0,否则 systemd 会认为失败 |
| 用户环境缺失 | 若脚本依赖 GUI 或 DISPLAY 变量,请改用桌面自启动 |
7.2 如何调试开机脚本?
可以在脚本中添加日志输出,帮助排查问题:
#!/bin/bash LOG=/tmp/startup.log echo "$(date): Starting auto_run_test.sh" >> $LOG echo "helloStartup" >> $LOG cd /home/user/mywbc_v5_usb/build && echo "Changed dir" >> $LOG || echo "Failed to change dir" >> $LOG ./sim/sim & # 后台运行避免阻塞 echo "Launched sim" >> $LOG这样即使看不到屏幕输出,也能通过查看/tmp/startup.log判断执行情况。
8. 总结
8.1 本文要点回顾
本文介绍了一种适合新手的 Linux 开机启动方案,完全避开了复杂的systemd单元配置,核心步骤如下:
- 编写 Shell 脚本:明确你要执行的任务,保存为
.sh文件。 - 赋予执行权限:使用
chmod +x让系统允许运行它。 - 利用 rc.local:将脚本调用写入
/etc/rc.local,并在exit 0前添加执行命令。 - 启用 rc.local 服务:对新版系统,需通过
systemctl enable rc-local激活支持。 - 测试重启验证:通过日志或输出文件确认脚本是否成功运行。
8.2 为什么推荐这种方式?
- 无需学习 systemd 语法:省去编写
.service文件的复杂流程。 - 兼容性强:适用于大多数 Ubuntu、Debian、CentOS 等主流发行版。
- 易于调试:脚本独立存在,可单独测试,出错容易定位。
- 适合自动化部署:可用于嵌入式设备、开发板、服务器初始化等场景。
8.3 下一步建议
当你熟悉了这种基础方式后,可以根据需求逐步过渡到更高级的方案,例如:
- 使用
systemd编写服务单元,实现更精细的控制(如失败重启、依赖管理)。 - 结合日志系统(journalctl)监控脚本运行状态。
- 将脚本打包为系统服务,提升稳定性和安全性。
但对于绝大多数日常用途和初学者项目,rc.local方案已经足够强大又足够简单。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。