如何在Raspbian OS Buster系统上设置脚本开机自动启动
问题核心原因
Raspbian Buster 相对 Jessie 调整了大量启动逻辑,你之前的操作大部分不符合新版系统规则,且脚本本身也有影响自启的配置问题。
各错误操作的纠正方案
1. 桌面级自启(适用于脚本依赖图形环境的场景)
你之前直接把shell脚本扔进autostart目录的操作是错误的,Buster 的 LXDE 桌面仅识别 .desktop 格式的启动项,且你之前的路径填写有误:
- 正确路径为
/home/pi/.config/autostart/,不需要额外创建AutoStart文件夹,直接在该目录下创建myprogram.desktop文件,内容如下:
[Desktop Entry] Type=Application Name=MyProgram Exec=/home/pi/myscript.sh Terminal=false
- 如果需要用会话级autostart,正确路径为
/home/pi/.config/lxsession/LXDE-pi/autostart,在该文件末尾追加一行@/home/pi/myscript.sh即可,不要自行创建错误路径的Autostart文件夹,会导致会话启动崩溃。
2. crontab @reboot 自启修正
你写的 @reboot -H /home/pi/myscript.sh 格式错误,-H 是sudo的参数不能直接跟在@reboot后面,且crontab执行环境无交互终端,脚本中的sudo命令会因为需要输入密码直接阻塞:
- 先给sudo执行对应程序加免密权限:执行
sudo visudo,在末尾追加一行pi ALL=(ALL) NOPASSWD: /home/pi/myproject/myprogram,保存退出。 - 编辑pi用户的crontab,正确写法为:
@reboot /bin/bash /home/pi/myscript.sh - 也可以直接用root用户的crontab,此时不需要配置sudo免密,直接写
@reboot /bin/bash /home/pi/myscript.sh即可。
3. rc.local 自启修正
rc.local 在桌面环境启动前就会执行,仅适用于不需要图形环境的程序,修改规则:
- 编辑
/etc/rc.local,在exit 0之前添加一行:/home/pi/myscript.sh &,加&是为了避免脚本阻塞系统启动流程。 - 确保rc.local本身有可执行权限:
sudo chmod +x /etc/rc.local
4. 官方推荐方案:systemd 服务自启(最稳定,兼容所有场景)
这是 Buster 官方主推的服务管理方案,比老旧的init.d兼容性更好:
- 在
/etc/systemd/system/下创建myprogram.service文件,内容如下:
[Unit] Description=My Custom Program After=multi-user.target # 如果依赖图形环境就把上面的After改成 After=graphical.target [Service] Type=simple User=pi ExecStart=/bin/bash /home/pi/myscript.sh Restart=on-failure [Install] WantedBy=multi-user.target # 依赖图形环境就改成 WantedBy=graphical.target
- 执行命令激活服务:
sudo systemctl daemon-reload sudo systemctl enable myprogram.service sudo systemctl start myprogram.service
脚本优化建议
你的脚本可以进一步调整避免环境问题:
#!/bin/bash # 建议用bash而不是sh,避免语法兼容问题 # 提前声明PATH,避免找不到命令 export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" cd /home/pi/myproject || exit 1 # 确定你的myprogram不需要图形环境的话,下面的sudo可以保留,否则建议用桌面级自启方案 sudo /home/pi/myproject/myprogram exit 0
内容的提问来源于stack exchange,提问作者ThN
相关产品推荐
相关产品推荐

