树莓派4 Ubuntu20.04下systemd运行GUI应用oversteer报无Display错误如何解决
问题原因
- DISPLAY变量冲突:脚本内设置
DISPLAY=:99.0,但service配置文件中设置DISPLAY=:0,变量不一致导致程序无法找到正确的X服务器地址 - 服务启动时机过早:当前配置的启动依赖
After=local-fs.target仅保证本地文件系统挂载完成,此时图形界面X服务还未启动,GUI程序无法连接显示服务 - 启动目标配置错误:
WantedBy=multi-user.target对应无图形界面的多用户运行级,默认不会加载X服务,桌面环境启动对应的目标是graphical.target - 权限配置冲突:服务未指定运行用户默认以root身份执行,同时脚本中重复使用
sudo执行命令,导致X授权信息传递失败 - 设备访问权限问题:oversteer操作方向盘硬件需要对应设备权限,直接用sudo执行会破坏图形环境变量传递
修复步骤
1. 修正oversteer.sh脚本
#!/bin/bash # 延长等待时间确保X服务完全启动 sleep 5s # 统一使用和service一致的DISPLAY变量 export DISPLAY=:0 # 无需额外设置屏幕参数,删除冗余配置 # 去掉sudo,后续通过udev规则配置硬件访问权限 oversteer --autocenter 45 & oversteer --range 720
给脚本赋予执行权限:chmod +x /home/ubuntu/g29_steering_wheel/autostart_scripts/oversteer.sh
2. 配置udev规则免sudo操作方向盘
新建/etc/udev/rules.d/99-steering-wheel.rules文件,写入以下内容:
SUBSYSTEM=="usb", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c24f", MODE="0666", GROUP="ubuntu"
注:如果你的罗技G29设备id不同,可以通过lsusb命令查询替换对应的idVendor和idProduct值
重载udev规则生效:sudo udevadm control --reload-rules && sudo udevadm trigger
3. 修正oversteer.service配置文件
[Unit] Description=oversteer steering wheel controller # 增加图形服务依赖,确保X启动后再运行 After=local-fs.target graphical.target display-manager.service [Service] # 指定运行用户为ubuntu,和XAUTHORITY所属用户一致 User=ubuntu Group=ubuntu Environment="DISPLAY=:0" Environment="XAUTHORITY=/home/ubuntu/.Xauthority" ExecStart=/home/ubuntu/g29_steering_wheel/autostart_scripts/oversteer.sh Restart=on-failure Type=simple StandardOutput=journal+console # 增加启动重试延迟,避免X未完全启动导致启动失败 RestartSec=3 [Install] # 修改为图形级目标 WantedBy=graphical.target
4. 重载systemd配置并启用服务
依次执行以下命令:
sudo systemctl daemon-reload sudo systemctl enable oversteer.service
重启系统即可验证服务是否正常运行。如果启动失败可通过journalctl -u oversteer.service -f查看详细错误日志排查问题。
内容的提问来源于stack exchange,提问作者siddharth
相关产品推荐
相关产品推荐

