测试开机启动脚本部署总结,适合初学者参考
1. 引言:为什么需要开机启动脚本
在实际的开发和运维场景中,我们常常希望某些程序或服务能够在系统启动时自动运行,而无需手动登录后执行。例如:
- 自动启动后台监控脚本
- 启动仿真程序或嵌入式测试环境
- 部署无人值守设备时初始化关键任务
对于 Linux 初学者而言,实现“开机自启”看似复杂,实则有多种简单可靠的方法。本文将以Ubuntu系统为例,详细介绍如何通过rc.local和/etc/profile两种方式部署开机启动脚本,并结合具体案例帮助初学者快速上手。
文章内容基于真实可运行的实践流程,适用于 Ubuntu 16.04 及以上版本(包括 18.04、20.04),特别适合作为镜像自动化初始化配置的参考方案。
2. 方法一:使用 rc.local 实现开机启动
2.1 创建启动脚本文件
首先,在用户目录下创建一个用于存放脚本的文件夹,并新建.sh脚本文件。
mkdir -p /home/user/Documents/scripts touch /home/user/Documents/scripts/auto_run_test.sh使用文本编辑器(如nano或vim)编辑该文件:
vim /home/user/Documents/scripts/auto_run_test.sh写入以下内容:
#!/bin/bash echo "helloStartup" > /home/user/Documents/scripts/output.txt cd /home/user/mywbc_v5_usb/build echo "EnterBuildDir" >> /home/user/Documents/scripts/output.txt ./sim/sim echo "AfterSim" >> /home/user/Documents/scripts/outputend.txt说明: -
#!/bin/bash是脚本解释器声明,必须放在第一行。 - 使用>>追加写入日志,避免覆盖前面的日志信息。 - 所有路径建议使用绝对路径,防止因工作目录不同导致执行失败。
2.2 设置脚本可执行权限
Linux 默认不允许随意执行脚本,需显式赋予执行权限:
sudo chmod +x /home/user/Documents/scripts/auto_run_test.sh也可以使用755权限(推荐):
sudo chmod 755 /home/user/Documents/scripts/auto_run_test.sh✅提示:不建议使用
777,存在安全风险,仅在调试阶段临时使用。
2.3 启用并修改 rc.local 文件
rc.local是传统 SysVinit 系统中的开机执行脚本,在大多数 Ubuntu 版本中仍可用,但默认可能未启用。
检查是否存在 rc.local
ls /etc/rc.local如果不存在,则手动创建:
sudo touch /etc/rc.local sudo chmod +x /etc/rc.local编辑 rc.local 内容
sudo vim /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. # # By default this script does nothing. # 添加你的命令 cd /home/user/Documents/scripts sh auto_run_test.sh exit 0⚠️注意要点: - 必须以
#!/bin/sh -e开头,-e表示遇到错误立即退出。 -exit 0必须保留,否则可能导致系统卡在启动界面。 - 脚本中不要阻塞主线程(如无限循环无后台运行),否则影响系统启动完成。
2.4 验证 rc-local 服务是否启用
现代 Ubuntu 使用 systemd,rc.local是否生效取决于rc-local.service是否激活。
查看服务状态:
systemctl status rc-local若未启用,需手动启用:
sudo systemctl enable rc-local sudo systemctl start rc-local3. 方法二:将命令追加到 /etc/profile(适用于无 rc.local 的系统)
部分精简版 Ubuntu 或容器环境中可能没有rc.local,此时可以利用/etc/profile实现类似效果。
3.1 profile 文件的作用机制
/etc/profile是所有用户登录时都会加载的全局环境配置文件。当图形界面或终端登录时会自动执行其中的命令。
❗局限性:此方法只在用户登录后触发,不是真正的“开机即运行”,适合 GUI 登录场景。
3.2 修改 /etc/profile
打开文件进行编辑:
sudo vim /etc/profile在文件末尾添加:
# 自动执行开机脚本 if [ -f /home/user/Documents/scripts/auto_run_test.sh ]; then sh /home/user/Documents/scripts/auto_run_test.sh fi保存退出即可。
✅优点:无需额外服务支持,兼容性强
❌缺点:依赖用户登录,无法用于无界面服务器常驻任务
4. 常见问题与解决方案
4.1 脚本未执行?检查点清单
| 检查项 | 建议操作 |
|---|---|
| 脚本是否有执行权限 | 使用ls -l script.sh查看,确保有x权限 |
| 是否使用了相对路径 | 改为绝对路径,如/home/user/... |
| rc.local 是否被 systemd 启用 | 运行systemctl is-enabled rc-local确认 |
| 日志输出是否可写 | 确保目标目录和文件具有写权限 |
| 脚本是否报错中断 | 在脚本开头去掉-e或重定向错误输出调试 |
4.2 输出日志为空?定位执行上下文
由于rc.local以 root 身份运行,其当前目录通常是/root,因此:
echo "test" > ./output.txt会尝试写入/root/output.txt,普通用户不可访问。
✅ 正确做法是使用完整路径:
echo "helloStartup" > /home/user/Documents/scripts/output.txt4.3 如何调试开机脚本?
可在脚本中加入时间戳记录执行情况:
#!/bin/bash DATE=$(date '+%Y-%m-%d %H:%M:%S') echo "[$DATE] Script started" >> /home/user/Documents/scripts/boot.log # 其他命令...重启后查看日志文件确认是否执行:
cat /home/user/Documents/scripts/boot.log5. 最佳实践建议
5.1 推荐使用 systemd 替代 rc.local(进阶)
虽然rc.local简单易用,但从长期维护角度看,systemd service更加规范、可控。
示例:创建一个 systemd 服务
# /etc/systemd/system/my-startup-script.service [Unit] Description=My Auto Startup Script After=multi-user.target [Service] Type=oneshot ExecStart=/home/user/Documents/scripts/auto_run_test.sh RemainAfterExit=yes User=user [Install] WantedBy=multi-user.target启用服务:
sudo systemctl daemon-reexec sudo systemctl enable my-startup-script.service✅ 优势:支持日志追踪(
journalctl -u my-startup-script)、依赖管理、失败重试等高级功能。
5.2 安全性提醒
- 避免对脚本和系统文件设置
777权限 - 尽量以非 root 用户运行应用逻辑
- 敏感操作应加入日志审计和异常处理
5.3 适用于镜像打包的自动化思路
如果你正在制作一个预装环境的系统镜像(如用于 AI 推理、边缘计算设备),可将整个流程写成自动化部署脚本:
#!/bin/bash # deploy-autostart.sh SCRIPT_DIR="/home/user/Documents/scripts" SERVICE_FILE="/etc/systemd/system/auto-run-test.service" # 创建目录和脚本 mkdir -p $SCRIPT_DIR cat > $SCRIPT_DIR/auto_run_test.sh << 'EOF' #!/bin/bash echo "$(date): Startup script running" >> $SCRIPT_DIR/boot.log cd /home/user/mywbc_v5_usb/build && ./sim/sim EOF chmod +x $SCRIPT_DIR/auto_run_test.sh # 配置 systemd 服务(推荐) cat > $SERVICE_FILE << 'EOF' [Unit] Description=Auto Run Test Script After=multi-user.target [Service] Type=oneshot ExecStart=/home/user/Documents/scripts/auto_run_test.sh RemainAfterExit=yes User=user [Install] WantedBy=multi-user.target EOF chmod 644 $SERVICE_FILE sudo systemctl daemon-reload sudo systemctl enable auto-run-test.service echo "Deployment completed. Reboot to test."这样可以在批量部署时一键完成开机启动配置。
6. 总结
本文围绕“测试开机启动脚本”的实际需求,系统梳理了两种适用于初学者的实现方式:
rc.local方案:接近“真正开机启动”,适合服务类任务,需注意权限和服务启用;/etc/profile方案:简单直接,但依赖用户登录,适合桌面环境下的初始化任务;
同时提供了完整的脚本示例、权限设置、调试方法以及常见问题排查清单,确保读者能够一次成功部署。
最后,我们也提出了向systemd service迁移的进阶建议,帮助开发者构建更稳定、可维护的自动化启动体系。
无论你是搭建开发环境、部署边缘设备,还是制作标准化系统镜像,本文的内容都具备良好的实用性和扩展性。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。