树莓派开机执行shell脚本时切换pi用户运行git pull失败,手动执行正常
故障原因
- 网络未就绪:LXDE-pi的autostart脚本执行时机非常早,通常在系统网络连接完全建立之前就会运行,此时git pull无法访问远程bitbucket仓库,直接执行失败。手动执行脚本时网络已完成初始化,因此可以正常拉取代码。
- SSH认证上下文缺失:你使用的是SSH协议的git仓库地址,非交互式会话中通过sudo切换用户执行命令时,不会加载pi用户的完整SSH环境配置,部分场景下会出现无法读取
~/.ssh/id_rsa私钥、未验证bitbucket主机公钥的问题。 - 缺少错误日志:当前脚本没有捕获git pull的错误输出,无法直接判断是网络问题还是认证问题。
解决步骤
- 先添加日志输出,定位具体错误
在autostart脚本的开头添加日志重定向逻辑,把所有执行输出和错误信息写入日志文件:
exec > /var/log/kiosk_autostart.log 2>&1 echo "=== 脚本启动时间:$(date) ==="
脚本执行后查看/var/log/kiosk_autostart.log里git pull对应的报错内容,即可确认具体故障点。
- 解决网络未就绪问题
在执行git pull之前添加网络检测逻辑,等待网络连通后再执行拉取操作:
# 最多等待30秒,确认bitbucket网络连通 for i in {1..30}; do ping -c 1 bitbucket.org &> /dev/null && break sleep 1 done
- 修复SSH认证问题
修改git pull命令,明确指定SSH私钥路径、跳过主机公钥确认,适配非交互式执行场景:
sudo -H -u pi bash -c 'cd /home/pi/你的项目路径 && GIT_SSH_COMMAND="ssh -i /home/pi/.ssh/id_rsa -o StrictHostKeyChecking=no" git pull git@bitbucket.org:你的仓库地址.git master'
- 可选优化:添加失败兜底逻辑
如果git pull失败不需要中断后续流程,可以添加执行结果判断,拉取失败时打印提示后继续运行Python脚本:
sudo -H -u pi bash -c 'cd /home/pi/你的项目路径 && GIT_SSH_COMMAND="ssh -i /home/pi/.ssh/id_rsa -o StrictHostKeyChecking=no" git pull git@bitbucket.org:你的仓库地址.git master' if [ $? -ne 0 ]; then echo "git pull执行失败,使用本地代码启动服务" fi
内容的提问来源于stack exchange,提问作者Pustekuchen
相关产品推荐
相关产品推荐

