树莓派开机执行.sh脚本?这个测试镜像实测成功
你是不是也遇到过这样的问题:写好了树莓派的自动化脚本,每次都要手动打开终端、切换目录、输入命令才能运行?一重启就回到原点,还得重复操作。更让人头疼的是,有些脚本压根没有图形界面,开机后桌面干干净净,根本看不出它在后台跑没跑——直到你敲ps aux | grep python才发现:“哦,原来它一直在”。
别急,这个问题有解。而且不是理论可行,是真正在树莓派上跑通了的实测方案。本文用的正是你看到的这个镜像——“测试开机启动脚本”,它已经预置了完整验证环境,所有步骤都经过反复测试,不绕弯、不踩坑、不依赖第三方工具。
下面我会用最直白的方式,带你从零完成一个可复用的开机自启流程:从创建脚本、设置权限,到配置自动启动项,再到验证是否真正生效。全程不讲抽象概念,只说“你该点哪里、输什么、看什么结果”。
1. 先搞清楚:树莓派开机启动到底有几种路子?
很多人一上来就改/etc/rc.local或者写 systemd 服务,结果要么失败,要么启动太早(比如网络还没起来就去连 Wi-Fi),要么桌面环境加载完才启动,体验割裂。其实树莓派(特别是基于 Raspberry Pi OS 的系统)有三层启动时机,选错一层,后面全白忙:
- 系统级启动(最早):内核加载完就跑,适合硬件初始化类任务
- 用户登录前启动:用户还没输入密码时已运行,适合守护进程
- 桌面环境启动后(最晚但最常用):GUI 加载完成,图标、菜单、终端都就位了
而我们日常要跑的.sh脚本——比如采集传感器数据、启动摄像头监控、定时上传日志——绝大多数都属于需要图形界面支持或依赖用户主目录权限的任务。所以,首选桌面级启动方案,既稳定又安全,还不用碰 root 权限。
那为什么不用.bashrc或.profile?因为它们只在你手动打开终端时才执行,开机自动启动的终端并不会读取这些文件。这是新手最容易掉进去的坑。
1.1 桌面启动的核心机制:.desktop文件
树莓派桌面环境(LXDE/LXQt)遵循 XDG Desktop Entry 规范,它的“开机自启”本质就是:让系统在桌面就绪后,自动执行一个.desktop文件里定义的命令。
这个文件长得像这样:
[Desktop Entry] Type=Application Name=My Startup Script Exec=lxterminal --working-directory=/home/pi/test/ --command=./test.sh Hidden=false X-GNOME-Autostart-enabled=true注意几个关键点:
Type=Application表示这是一个可执行程序入口Name是你在“启动应用管理器”里看到的名字,随便起,但建议有意义Exec是真正干活的地方,也是最容易出错的一行Hidden=false让它可见(方便调试),后期可改为trueX-GNOME-Autostart-enabled=true是 LXDE 实际识别的启用开关(别信网上说的Autostart=true,那个不管用)
这个文件必须放在~/.config/autostart/目录下,且后缀必须是.desktop,名字可以是my-script.desktop,但不能叫my-script或my-script.ini。
2. 实操:三步搞定开机执行 test.sh
我们以镜像中预置的/home/pi/test/目录为例,里面已有test.sh和test.py。现在开始一步步让它开机就跑。
2.1 第一步:确认脚本可独立运行
先别急着配自启,确保脚本本身没问题。打开终端,手动执行一次:
cd /home/pi/test/ chmod +x test.sh ./test.sh你应该看到输出:
run test! Hello from Python script!如果报错Permission denied,说明没加执行权限;如果报command not found,检查test.sh第一行是不是#!/bin/bash;如果 Python 报错找不到模块,说明路径或环境不对——这些都得在自启前解决。
小贴士:
test.sh内容如下(已预置在镜像中):#!/bin/bash echo "run test!" python /home/pi/test/test.py
test.py只有一行打印语句,确保它不依赖外部库,纯粹验证流程。
2.2 第二步:创建 autostart desktop 文件
在终端中执行以下命令,一键生成配置文件:
mkdir -p ~/.config/autostart cat > ~/.config/autostart/test-launcher.desktop << 'EOF' [Desktop Entry] Type=Application Name=Test Script Launcher Comment=Run test.sh on desktop startup Exec=lxterminal --working-directory=/home/pi/test/ --command=./test.sh Icon=utilities-terminal Terminal=false Hidden=false X-GNOME-Autostart-enabled=true EOF注意:这里用了<< 'EOF'语法,确保单引号包裹,防止 shell 提前解析$符号;Icon=utilities-terminal是个可选美化项,会显示终端图标;Terminal=false表示不额外弹窗(因为lxterminal已经是终端了)。
执行完后,检查文件是否生成:
ls -l ~/.config/autostart/ # 应该看到 test-launcher.desktop2.3 第三步:重启验证,看它到底动没动
别用sudo reboot,直接点击桌面右上角电源图标 → “重启”。等桌面完全加载出来(约 20 秒),观察:
- 是否弹出一个终端窗口?
- 窗口标题是否是
LXTerminal? - 窗口里是否打印出
run test!和 Python 的输出?
如果都满足,恭喜,你已经成功了。
如果没弹窗,但ps aux | grep test.sh能查到进程,说明脚本在后台静默运行了——这是因为Exec里漏了--working-directory,导致./test.sh找不到路径。这是镜像文档里特别强调的坑:“必须先设置--working-directory,不能直接-e或--command=”。
3. 常见问题与真实排错记录(来自镜像实测)
这个镜像不是纸上谈兵,而是把所有翻车现场都录下来、修好了再打包的。以下是我们在测试过程中遇到的真实问题和对应解法:
3.1 问题:终端一闪而逝,啥也没看到
现象:开机后终端窗口弹出来,0.5 秒就消失了。
原因:脚本执行完就退出,终端没保持打开。
解法:在test.sh最后加一行read -p "Press any key to continue...",或者改用--command=bash -c "./test.sh; exec bash"让终端保活。
镜像已修复:当前test.sh末尾已添加exec bash,确保窗口常驻。
3.2 问题:Python 报错ModuleNotFoundError: No module named 'requests'
现象:手动运行正常,开机启动就报错。
原因:桌面环境启动时用的是pi用户的默认 shell 环境,但pip install安装的包可能在--user目录,而lxterminal启动时未加载.bashrc中的PATH。
解法:在test.sh开头显式加载环境:
#!/bin/bash source /home/pi/.bashrc echo "run test!" python /home/pi/test/test.py镜像已预置:test.sh默认已包含source行,适配常见 Python 包场景。
3.3 问题:脚本执行了,但摄像头打不开(libcamera报错)
现象:test.py里调用picamera2,开机启动时报设备忙。
原因:桌面刚起来时,GPU 驱动或摄像头子系统尚未完全就绪。
解法:加延时重试:
#!/bin/bash source /home/pi/.bashrc echo "run test!" sleep 3 # 等待硬件就绪 python /home/pi/test/test.py镜像提示:文档中已注明“如需访问硬件,请在脚本开头加 sleep”。
4. 进阶技巧:不止于弹窗,还能更安静、更可靠
上面的方法适合调试和轻量任务。如果你希望脚本在后台默默运行、不打扰桌面,同时还能查看日志、随时重启,这里有两个升级方案:
4.1 方案一:用 systemd user service(推荐给进阶用户)
比.desktop更规范,支持日志、依赖管理、自动重启。只需三步:
- 创建服务文件:
mkdir -p ~/.config/systemd/user cat > ~/.config/systemd/user/test-script.service << 'EOF' [Unit] Description=Test Script Service After=graphical-session.target [Service] Type=simple WorkingDirectory=/home/pi/test ExecStart=/home/pi/test/test.sh Restart=on-failure RestartSec=10 [Install] WantedBy=default.target EOF- 启用并启动:
systemctl --user daemon-reload systemctl --user enable test-script.service systemctl --user start test-script.service- 查看日志:
journalctl --user -u test-script.service -f优势:不弹窗、可查日志、崩溃自动重启、支持
After=控制启动顺序
注意:必须用--user,否则要改权限,不推荐。
4.2 方案二:用 crontab @reboot(适合纯后台任务)
如果脚本完全不需要 GUI,只是定期采集数据、发邮件,可以用 cron:
crontab -e # 添加这一行: @reboot sleep 10 && /home/pi/test/test.sh >> /home/pi/test/log.txt 2>&1sleep 10是为了等网络和存储挂载完成;>>把输出存到日志,方便排查。
5. 总结:一条能抄、能改、能落地的完整链路
回看整个过程,我们没改系统核心配置,没碰 root 权限,没装新软件,只做了三件事:
- 写好一个带
#!/bin/bash的test.sh,加执行权限 - 创建一个标准
.desktop文件,放在~/.config/autostart/ - 用
lxterminal --working-directory=xxx --command=./xxx.sh精准指定路径和命令
这就是树莓派桌面环境下,最轻量、最稳定、最易调试的开机自启方案。它不追求“高大上”,只解决“能不能用”这个根本问题。
你现在拿到的这个“测试开机启动脚本”镜像,就是这条链路的完整封装:所有路径已预设、权限已配置、desktop 文件已就位、连test.py的输出都加了时间戳便于验证。你只需要git clone你的项目、替换test.sh里的命令、重启——事情就成了。
别再被各种教程绕晕了。记住一句话:想让脚本开机跑,先让它手动跑通;想让它手动跑通,先看它缺什么权限、少什么环境、等不等硬件。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。