通过使用systemd配置opencv程序自启动出现qt.qpa.xcb:could not connect to display qt.qpa.plugin: could not load the Qt platform plugin "xcb的错误

1.定位错误

一般的systemd配置文件如下:

 [Unit]
 Description=My service
 After=network.target
 ​
 [Service]
 Restart=on-failure
 RestartSec=5
 ExecStart=/usr/bin/python3 -u /home/pi/myled.py
 User=pi
 ​
 [Install]
 WantedBy=multi-user.target

但是对于opencv这种需要依赖PYQT插件显示CV2.IMSHOW少了一个参数:

 Environment=DISPLAY=:0.0
2.解决错误
(1)配置设置

通过查阅DISPLAY在Linux的作用Linux DISPLAY 变量设置小草新浪博客发现

在2台Linux机器之间, 如果设置服务器端配置文件/etc/ssh/sshd_config中包含

 X11Forwarding no

客户端配置文件/etc/ssh/ssh_config包含

 ForwardX11 yes

则从客户端ssh到服务器端后会自动设置DISPLAY环境变量, 允许在服务器端执行的图形程序将图形显示在客户端上. 在服务器上查看环境变量显示如下(这个结果不同的时候并不相同)

所以修改

 sudo nano /etc/ssh/sshd_config

中的‘X11Forwarding’变为no,ctrl+o保存 enter确定 crtl+x关闭即可修改成功

(2)查找环境变量
 echo $DISPLAY

如果输出的为空,则表示该环境变量没有设置。我使用的是debian系统,默认的是没有设置该环境变量。

因此需要设置该环境变量,在终端上执行下面命令:

export DISPLAY=:0

如果成功返回

那么参数可变为

 Environment=DISPLAY=:0

1.最后systemd配置文件变为

 [Unit]
 Description=example service
  
 [Service]
 ExecStart=/bin/python3 /home/wcy/Project/test.py
 Environment=DISPLAY=:0
 Restart=on-failure
 RestartSec=5
 User=wcy
 type=idle
  
 [Install]
 WantedBy=multi-user.target

2.将该文件mystart.service复制到/etc/systemd/system目录下

 sudo cp /home/wcy/Project/example.service /etc/systemd/system/mystart.service

3.使用systemctl管理服务

  • 启动服务

 sudo systemctl start mystart.service

此时可以看到led闪烁

  • 添加或修改配置文件后,需要重新加载

 sudo systemctl daemon-reload
  • 设置开机自启动

 sudo systemctl enable mystart.service
  • 关闭开机自启动

 sudo systemctl disable mystart.service

问题得到解决使用。

总结

实际问题是对Linux系统的DISPLAY参数的不理解。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐