用systemd 来控制 qt 程序的启动, 停止 . 解决 qt.qpa.xcb: could not connect to display 问题


author: hjjdebug
date: 2024年 09月 28日 星期六 15:49:51 CST
description: 用systemd 来控制 qt 程序的启动,停止
解决 qt.qpa.xcb: could not connect to display 问题

1. 先写一个QT 的测试程序 basic,

让他不断打印数字.

$ cat main.cpp 
#include <QApplication>
#include <QThread>
#include <QDebug>class MyThread: public QThread
{void run(){int count=0;while(1){qDebug()<<"running:"<<count++;sleep(1);}}
};
int main(int argc, char *argv[])
{QApplication app(argc,argv);MyThread thread;thread.start();return app.exec();
}
1.1: 运行,正常
$ ./basic
running: 0
running: 1
running: 2
running: 3

2. 再写这个程序的服务配置文件

$ cat basic.service 
[Unit]
Description=Basic Test[Service]
Type=simple
ExecStart=/home/hjj/test/qt//basic/basic
Restart=on-failure[Install]
WantedBy=multi-user.target

3. 测试: 启动服务失败:

$ sudo systemctl start basic.service

4. 状态查询

$ sudo systemctl status basic.service

● basic.service - Basic TestLoaded: loaded (/etc/systemd/system/basic.service; disabled; vendor preset: enabled)Active: failed (Result: core-dump) since Fri 2024-09-27 09:18:56 CST; 5s agoProcess: 6062 ExecStart=/home/hjj/test/qt//basic/basic (code=dumped, signal=ABRT)Main PID: 6062 (code=dumped, signal=ABRT)927 09:18:56 hjj-7090 systemd[1]: basic.service: Scheduled restart job, restart counter is at 5.
927 09:18:56 hjj-7090 systemd[1]: Stopped Basic Test.
927 09:18:56 hjj-7090 systemd[1]: basic.service: Start request repeated too quickly.
927 09:18:56 hjj-7090 systemd[1]: basic.service: Failed with result 'core-dump'.
927 09:18:56 hjj-7090 systemd[1]: Failed to start Basic Test.

5. 详细系统日志

$ journalctl -u basic.service

-- Logs begin at Thu 2024-07-25 08:51:30 CST, end at Fri 2024-09-27 09:26:52 CST. --
927 09:18:53 hjj-7090 systemd[1]: Started Basic Test.
927 09:18:53 hjj-7090 basic[6043]: qt.qpa.xcb: could not connect to display
927 09:18:53 hjj-7090 basic[6043]: qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
927 09:18:53 hjj-7090 basic[6043]: This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
927 09:18:53 hjj-7090 basic[6043]: Available platform plugins are: linuxfb, minimal, offscreen, vnc, xcb.
927 09:18:53 hjj-7090 systemd[1]: basic.service: Main process exited, code=dumped, status=6/ABRT
927 09:18:53 hjj-7090 systemd[1]: basic.service: Failed with result 'core-dump'.
927 09:18:54 hjj-7090 systemd[1]: basic.service: Scheduled restart job, restart counter is at 1.
927 09:18:54 hjj-7090 systemd[1]: Stopped Basic Test.
927 09:18:54 hjj-7090 systemd[1]: Started Basic Test.
927 09:18:54 hjj-7090 basic[6054]: qt.qpa.xcb: could not connect to display
927 09:18:54 hjj-7090 basic[6054]: qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
927 09:18:54 hjj-7090 basic[6054]: This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
927 09:18:54 hjj-7090 basic[6054]: Available platform plugins are: linuxfb, minimal, offscreen, vnc, xcb.
927 09:18:54 hjj-7090 systemd[1]: basic.service: Main process exited, code=dumped, status=6/ABRT
927 09:18:54 hjj-7090 systemd[1]: basic.service: Failed with result 'core-dump'.
927 09:18:54 hjj-7090 systemd[1]: basic.service: Scheduled restart job, restart counter is at 2.
927 09:18:54 hjj-7090 systemd[1]: Stopped Basic Test.
927 09:18:54 hjj-7090 systemd[1]: Started Basic Test.
927 09:18:54 hjj-7090 basic[6057]: qt.qpa.xcb: could not connect to display
927 09:18:54 hjj-7090 basic[6057]: qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
927 09:18:54 hjj-7090 basic[6057]: This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
927 09:18:54 hjj-7090 basic[6057]: Available platform plugins are: linuxfb, minimal, offscreen, vnc, xcb.
927 09:18:54 hjj-7090 systemd[1]: basic.service: Main process exited, code=dumped, status=6/ABRT
927 09:18:54 hjj-7090 systemd[1]: basic.service: Failed with result 'core-dump'.
927 09:18:55 hjj-7090 systemd[1]: basic.service: Scheduled restart job, restart counter is at 3.
927 09:18:55 hjj-7090 systemd[1]: Stopped Basic Test.
927 09:18:55 hjj-7090 systemd[1]: Started Basic Test.
927 09:18:55 hjj-7090 basic[6059]: qt.qpa.xcb: could not connect to display
927 09:18:55 hjj-7090 basic[6059]: qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
927 09:18:55 hjj-7090 basic[6059]: This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
927 09:18:55 hjj-7090 basic[6059]: Available platform plugins are: linuxfb, minimal, offscreen, vnc, xcb.
927 09:18:55 hjj-7090 systemd[1]: basic.service: Main process exited, code=dumped, status=6/ABRT
927 09:18:55 hjj-7090 systemd[1]: basic.service: Failed with result 'core-dump'.
927 09:18:55 hjj-7090 systemd[1]: basic.service: Scheduled restart job, restart counter is at 4.
927 09:18:55 hjj-7090 systemd[1]: Stopped Basic Test.
927 09:18:55 hjj-7090 systemd[1]: Started Basic Test.
927 09:18:55 hjj-7090 basic[6062]: qt.qpa.xcb: could not connect to display
927 09:18:55 hjj-7090 basic[6062]: qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
927 09:18:55 hjj-7090 basic[6062]: This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
927 09:18:55 hjj-7090 basic[6062]: Available platform plugins are: linuxfb, minimal, offscreen, vnc, xcb.
927 09:18:55 hjj-7090 systemd[1]: basic.service: Main process exited, code=dumped, status=6/ABRT
927 09:18:55 hjj-7090 systemd[1]: basic.service: Failed with result 'core-dump'.
927 09:18:56 hjj-7090 systemd[1]: basic.service: Scheduled restart job, restart counter is at 5.
927 09:18:56 hjj-7090 systemd[1]: Stopped Basic Test.
927 09:18:56 hjj-7090 systemd[1]: basic.service: Start request repeated too quickly.
927 09:18:56 hjj-7090 systemd[1]: basic.service: Failed with result 'core-dump'.
927 09:18:56 hjj-7090 systemd[1]: Failed to start Basic Test.

6. 错误原因: 环境变量不同所致!

systemd 的环境变量,只有区区17行

$ cat env.log
LANGUAGE=zh_CN
LC_ADDRESS=en_US.UTF-8
LC_NAME=en_US.UTF-8
LC_MONETARY=en_US.UTF-8
PWD=/
LC_PAPER=en_US.UTF-8
LANG=zh_CN.UTF-8
INVOCATION_ID=049b2226a6d74f39a2fb88aa82227756
LC_IDENTIFICATION=en_US.UTF-8
SHLVL=1
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_TIME=en_US.UTF-8
JOURNAL_STREAM=8:92364
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
LC_NUMERIC=en_US.UTF-8
_=/usr/bin/env

而我自己command 的环境变量有61行之多.
经过洗礼才有印象, 最后经过反复测试,比较得到2个关键环境变量.

DISPLAY:=0
XAUTHORITY=/run/user/1000/gdm/Xauthority

7. 命令行下复现问题.

你可以如下测试一下.
$ unset DISPLAY
hjj@hjj-7090:~/test/qt/basic$ ./basic
qt.qpa.xcb: could not connect to display
qt.qpa.plugin: Could not load the Qt platform plugin “xcb” in “” even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: linuxfb, minimal, offscreen, vnc, xcb.

已放弃 (核心已转储)

8. 错误到底是在什么地方出现的?

错误出处,原来在QApplication app(argc,argv)中有大量的函数调用,而且大量访问环境变量getenv(),
而其中DISPLAY,XAUTHORITY 环境变量是不可缺少的!!
否则就会在下面函数中打印出错信息!!

QApplicationPrivate::createEventDispatcher
"+>in init_platform of kernel/qguiapplication.cpp:1200                                               
21 in QGuiApplicationPrivate::createPlatformIntegration of ../../include/QtCore/../../src/corelib/te
32 in QGuiApplicationPrivate::createEventDispatcher of kernel/qguiapplication.cpp:1472              
43 in QApplicationPrivate::createEventDispatcher of kernel/qapplication.cpp:188                    
54 in QCoreApplicationPrivate::init of kernel/qcoreapplication.cpp:865                            
65 in QGuiApplicationPrivate::init of kernel/qguiapplication.cpp:1501                            
76 in QApplicationPrivate::init of kernel/qapplication.cpp:546                                  
87 in QApplication::QApplication of kernel/qapplication.cpp:534                                
98 in main of main.cpp:19                                                                     

调试挺不爽的,可能是有-O2 优化吧,算了,不调试了!

9. 解决办法: 补足其所需要的环境变量.

具体实现办法有两种,
一种是: 让服务程序去调用脚本. 脚本内容是先设置环境变量,再调用执行程序.
另一种: 让服务程序先设置环境变量,再调用程序.

我这里给出第一种吧,

$ cat basic.sh 
#!/bin/bash
export XAUTHORITY=/run/user/1000/gdm/Xauthority
export DISPLAY=:0
/home/hjj/test/qt/basic/basic &$ cat basic.service 
[Unit]
Description=Basic Test[Service]
Type=forking
#EnvironmentFile=/home/hjj/test/qt/basic/basic.env
ExecStart=/home/hjj/test/qt/basic/basic.sh
Restart=on-failure[Install]
WantedBy=multi-user.target


第二种就是把环境变量写到一个文件中例如 basic.env

$ cat basic.env
XAUTHORITY=/run/user/1000/gdm/Xauthority
DISPLAY=:0

并在上述服务配置中打开basic.env , 则basic.sh 中可不用导出环境变量
不管背着还是抱着,都是要把环境变量配上.

10. 最后的结果

$ sudo systemctl status basic.service

● basic.service - Basic TestLoaded: loaded (/etc/systemd/system/basic.service; disabled; vendor preset: enabled)Active: active (running) since Sat 2024-09-28 14:59:52 CST; 1h 1min agoProcess: 109495 ExecStart=/home/hjj/test/qt/basic/basic.sh (code=exited, status=0/SUCCESS)Main PID: 109498 (basic)Tasks: 3 (limit: 9097)Memory: 2.1MCGroup: /system.slice/basic.service└─109498 /home/hjj/test/qt/basic/basic928 16:01:31 hjj-7090 basic.sh[109498]: running: 3698
928 16:01:32 hjj-7090 basic.sh[109498]: running: 3699
928 16:01:33 hjj-7090 basic.sh[109498]: running: 3700
928 16:01:34 hjj-7090 basic.sh[109498]: running: 3701
928 16:01:35 hjj-7090 basic.sh[109498]: running: 3702

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/880536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于STM32的无人驾驶车辆系统

目录 引言项目背景环境准备 硬件准备软件安装与配置系统设计 系统架构关键技术代码示例 传感器数据采集与处理路径规划与避障控制实时反馈与控制系统应用场景结论 1. 引言 随着无人驾驶技术的发展&#xff0c;嵌入式系统在无人驾驶车辆中的应用变得越来越重要。STM32作为高效…

Java SPI 原理、样例

在 Java 中&#xff0c;SPI&#xff08;Service Provider Interface&#xff09;全称为服务提供者接口&#xff0c;它是一种用于实现框架扩展和插件化的机制。 一、SPI 作用 允许在运行时动态地为接口查找服务实现&#xff0c;而不需要在代码中显式地指定具体的实现类。 这使得…

WordPress精选文章如何添加侧边栏和页面?

WordPress精选帖子是一项功能&#xff0c;可让用户在其网站主页或其他值得注意的部分突出显示特定帖子。这些精选帖子通常以视觉上独特的方式显示&#xff0c;例如以滑块、网格或轮播格式显示&#xff0c;以提高其可见性和对访问者的吸引力。 网站所有者可以手动选择他们想要推…

云计算Openstack

OpenStack是一个开源的云计算管理平台项目&#xff0c;由美国国家航空航天局&#xff08;NASA&#xff09;和Rackspace公司合作研发并发起&#xff0c;以Apache许可证授权。该项目旨在为公共及私有云的建设与管理提供软件支持&#xff0c;通过一系列相互协作的组件实现云计算服…

MMD模型及动作一键完美导入UE5-衣服布料模拟(四)

1、给角色刷布料 1、打开角色,通过Window->Clothing打开模型布料窗口 2、选中裙子右键,创建布料数据 3、选择裙子,右键->应用布料数据 4、激活布料画笔,就可以开始绘制布料了 5、调整画笔大小和布料值进行绘制,布料值为0表示刚体

高校教师成果管理小程序的设计与实现springboot(lw+演示+源码+运行)

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱&#xff0c;出错率高&#xff0c;信息安全…

5分钟精通Excel在go中的使用

一些简单操作可以在官方文档中找到&#xff0c;应该足够无经验的朋友们入门 介绍 - 《Excelize v2.2 中文文档》 - 书栈网 BookStack 这里贴一个中文版的链接&#xff08;以excelize库为例&#xff0c;相对其他库来说&#xff0c;体验很不错&#xff09;&#xff0c;不过要注…

c++反汇编逆向还原——for循环(笔记)

c反汇编逆向还原代码for循环的实现&#xff0c;for循环和while循环在逆向还原的区别 一、汇编 mov &#xff1a;将源操作数复制到目的操作数 lea &#xff1a;与mov类似 mov a&#xff0c;b 表示将b赋值给a 若是 mov a&#xff0c;[b] 这是将b的地址赋值给a&#xff0c;相…

第一弹:llama.cpp编译

1.编译llama.cpp命令行&#xff08;电脑版本&#xff09;&#xff1b; 2.交叉编译安卓命令行版本。 一、Llama.cpp是什么&#xff1f; 二、Llama.cpp编译 首先我们尝试编译llama.cpp. 2.1 下载llama.cpp 项目的github地址&#xff1a; https://github.com/ggerganov/llama…

Linux---文件io

1.系统调用 由操作系统实现并提供给外部应用程序的编程接口。(Application Programming Interface&#xff0c;API)。是应用程序同系统之间数据交互的桥梁。 C标准函数和系统函数调用关系。一个helloworld如何打印到屏幕。 man手册中一共有九卷&#xff0c;其中一卷就有讲到系…

连锁店收银系统如何选择?

在新零售背景下&#xff0c;连锁店的收银系统扮演着至关重要的角色。随着科技的不断发展和消费者需求的不断变化&#xff0c;一款功能齐全的收银系统不仅可以提高便利店的运营效率&#xff0c;还可以提供更好的消费体验。以下是连锁店收银系统必备的功能。 1.收银系统能支持独…

【二十七】【QT开发应用】VS如何复制项目,QT无边窗窗口Pro版本,信号与信号槽的应用,背景图片自适应控件大小

VS复制项目 在使用VS的过程中,有的时候我们需要复制我们已经存在的项目. 我们可以先创建一个新的项目. 接着把需要复制的项目的文件复制粘贴到新的项目文件夹中. 不要忘记添加现有项目. CFrameLessWidgetBase.h #pragma once #include <QWidget> class CFrameLessWi…

书生大模型实战(从入门到进阶)L2-茴香豆:企业级知识库问答工具

目录 茴香豆介绍 茴香豆本地标准版搭建 环境搭建 配置服务器&#xff1a; 搭建茴香豆虚拟环境&#xff1a; 安装茴香豆 下载茴香豆 安装茴香豆所需依赖 下载模型文件 更改配置文件 知识库创建 测试知识助手 命令行运行 Gradio UI 界面测试 本文是对书生大模型L2-茴香…

SwiftUI简明概念(3):Path.addArc的clockwise方向问题

一、画个下半圆 SwiftUI中绘制下半圆的一个方法是使用Path.addArc&#xff0c;示例代码如下&#xff1a; var body: some View {Path { path inpath.addArc(center: CGPoint(x: 200, y: 370), radius: 50, startAngle: Angle(degrees: 0), endAngle: Angle(degrees: 180.0), …

自然语言处理实战项目:从基础到实战

自然语言处理实战项目&#xff1a;从基础到实战 自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;是人工智能的重要分支&#xff0c;致力于让计算机能够理解、生成和处理人类语言。NLP 在搜索引擎、智能客服、语音助手等场景中扮演着关键角色。本文将带…

MyBatis-Plus分页查询

在实际开发中&#xff0c;对于大量数据的查询&#xff0c;可以通过分页查询的方式来减少查询量和提高查询效率。在 MyBatis-Plus 中&#xff0c;分页查询可以通过使用 Page 对象和 IService 接口提供的分页方法来实现。MyBatis-Plus 的分页插件 PaginationInnerInterceptor 提供…

基于单片机的水位检测系统仿真

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机&#xff0c;DHT11温湿度采集温湿度&#xff0c;滑动变阻器连接ADC0832数模转换器模拟水位传感器检测水位&#xff0c;通过LCD1602显示信息&#xff0c;然后在程序里设置好是否…

【文件增量备份系统】MySQL百万量级数据量分页查询性能优化

&#x1f3af; 导读&#xff1a;本文针对大数据量下的分页查询性能问题进行了深入探讨与优化&#xff0c;最初查询耗时长达12秒&#xff0c;通过避免全表计数及利用缓存保存总数的方式显著提升了浅分页查询速度。面对深分页时依然存在的延迟&#xff0c;采用先查询倒数第N条记录…

时间序列LSTM实现

这个代码参考了时间序列预测模型实战案例(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)_lstm预测模型-CSDN博客 结合我之前所学的lstm-seq2seq里所学习到的知识对其进行预测 import time import numpy as np import pandas as pd import torch import…

Meta Sapiens 人体AI模型

Meta 一直是开发图像和视频模型的领导者&#xff0c;现在他们又增加了一个新东西&#xff1a;Meta Sapiens。和Homo sapiens一样&#xff0c;这个模型也是关于人类的。它旨在执行与人类相关的任务&#xff0c;例如理解身体姿势、识别身体部位、预测深度&#xff0c;甚至确定皮肤…