首页 > 解决方案 > 使用 systemd 在操作系统启动时运行我的 python 程序时出现 Xlib.error.DisplayConnectionError

问题描述

[Unit]
Description=Daemon tool that opens the required environment given a 
certain shortcut key

[Service]
Environment="DISPLAY=:0"
ExecStart=/usr/local/bin/keyboard_listener.py

[Install]
WantedBy=multi-user.target

5 月 8 日 11:49:43 debian keyboard_listener.py[303]: 文件“/usr/local/lib/python3.5/dist-packages/Xlib/protocol/display.py”,第 90 行,在init

5 月 8 日 11:49:43 debian keyboard_listener.py[303]: self.socket = connect.get_socket(name, protocol, host, displayno)

5 月 8 日 11:49:43 debian keyboard_listener.py[303]: 文件“/usr/local/lib/python3.5/dist-packages/Xlib/support/connect.py”,第 87 行,在 get_socket

5 月 8 日 11:49:43 debian keyboard_listener.py[303]: return mod.get_socket(dname, protocol, host, dno)

5 月 8 日 11:49:43 debian keyboard_listener.py[303]: 文件“/usr/local/lib/python3.5/dist-packages/Xlib/support/unix_connect.py”,第 113 行,在 get_socket

5 月 8 日 11:49:43 debian keyboard_listener.py[303]: 引发 error.DisplayConnectionError(dname, str(val))

5 月 8 日 11:49:43 debian keyboard_listener.py[303]: Xlib.error.DisplayConnectionError: Can't connect to display ":0": [Errno 111] Connection denied

5 月 8 日 11:49:43 debian systemd[1]: my_project.service: 主进程退出,code=exited,status=1/FAILURE

5 月 8 日 11:49:43 debian systemd[1]: my_project.service:单元进入失败状态。

5 月 8 日 11:49:43 debian systemd [1]: my_project.service:失败,结果为“退出代码”。

我该如何解决这个问题(错误 111)?我应该向 my_project.service 添加一些东西吗?如何让我的项目在启动时运行?

标签: python-3.xsystemd

解决方案


tl;博士:systemd不会工作

在没有显式排序依赖的情况下,systemd同时处理事务中的所有单元。这意味着在启动您的设备之前,它不会也不会等待 X 服务器在 display :0 上可用.service

在现代 GNU/Linux 发行版中,X 服务器不是由任何 systemd 单元直接启动的,因此您不能指定对 X 服务器的 systemd 排序依赖。因此systemd,它不适合您想要完成的任何事情,至少在 systemd 中实现更细粒度的依赖机制之前不适合。

建议的解决方法

作为一种解决方法,您可以尝试/etc/xdg/autostart,~/.config/autostart~/.xinitrc(适用于您的 X.org 设置的任何方法)。这些脚本保证从图形用户会话内部运行。

如果需要状态监视,您可以结合这两种方法并从其中一个脚本中使用systemd-run(1)或等效项启动瞬态 systemd 单元。


推荐阅读