如果通过 Systemd 过早启动应用程序会失败——需要什么依赖关系?

如果通过 Systemd 过早启动应用程序会失败——需要什么依赖关系?

RPI 3b+,Debian Stretch

我想通过 systemd 启动 Qt 应用程序。该应用程序使用X并且需要打开一个显示。

由于 MIT_MAGIC-COOKIE 无效,它总是失败。但随后 systemd 重新启动它(失败时)并且运行良好。 (“启动 APES 显示应用程序是我的 Qt 应用程序 - 我的 grep 发现“Light Display Manager 有同样的问题 - 第一次失败,但重新启动后成功)

pi@right-display:~ $ cat /var/log/syslog | pi@right-display:~ $ cat /var/log/syslog | grep 显示

11 月 16 日 10:43:26 右显示 systemd[1]:停车灯显示管理器...

11 月 16 日 10:43:40 右显示 systemd[1]:已启动 启动 APES 显示应用程序。

11 月 16 日 10:43:40 右显示 systemd[1]:启动灯光显示管理器...

11 月 16 日 10:43:41 右显示器 x11vnc[653]:16/11/2023 10:43:41 *** XOpenDisplay 失败。无显示或显示。

11 月 16 日 10:43:41 右显示 systemd[1]:启动 Light Display Manager。

11 月 16 日 10:43:42 右显示 APES_Display[572]:QStandardPaths:XDG_RUNTIME_DIR 未设置,默认为“/tmp/runtime-pi” 11 月 16 日 10:43:44 右显示 APES_Display[572]:无效 MIT-MAGIC -COOKIE-1 keyqt.qpa.screen:QXcbConnection:无法连接到显示器:0 11 月 16 日 10:43:44 右显示器 APES_Display[572]:无法连接到任何 X 显示器。

11 月 16 日 10:43:44 右显示 systemd[1]: Display.service: 主进程已退出,代码=已退出,状态=1/FAILURE

11 月 16 日 10:43:44 右显示 systemd[1]: Display.service: 单元进入失败状态。

11 月 16 日 10:43:44 右显示 systemd[1]:Display.service:失败,结果为“退出代码”。

11 月 16 日 10:43:45 右显示器 x11vnc[653]: 16/11/2023 10:43:45 *** XOpenDisplay“:0”成功。

11 月 16 日 10:44:02 右显示 systemd[1]: Display.service: 服务延迟时间结束,计划重新启动。

11 月 16 日 10:44:02 右显示 systemd[1]:已停止启动 APES 显示应用程序。

11 月 16 日 10:44:02 右显示 systemd[1]:已启动 启动 APES 显示应用程序。

11 月 16 日 10:44:02 右显示 APES_Display[1307]: QStandardPaths: XDG_RUNTIME_DIR 未设置,默认为 '/tmp/runtime-pi'

那么,在我的应用程序可以打开显示之前,必须运行某些服务吗?或者,我是否需要创建一个似乎只在启动时需要的“神奇cookie”(手动启动服务总是有效)

我如何弄清楚它是什么?

答案1

最好的方法可能是创建一个 systemd 计时器,该计时器将等待几秒钟,直到显示可操作并使您的服务依赖于该计时器。OnBootSec=是应该使用的计时器选项。从我们可以看到,第一个故障出现在Starting LDM 和Started LDM 之间。

相关内容