python-3.x - 使用 systemd 在操作系统启动时运行我的 python 程序时出现 Xlib.error.DisplayConnectionError
问题描述
基本背景资料:
我正在尝试在操作系统启动时运行我的程序(我当前的操作系统是 Debian 9 最新稳定版本)我的项目正在使用 Xlib 库听键盘,并且我也在使用 Tkinter 来弹出一些 UI 窗口。
这是 /etc/system/system/my_project.service
[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
- 重新启动后我运行:
sudo systemctl status my_project.service
我收到以下错误
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 添加一些东西吗?如何让我的项目在启动时运行?
解决方案
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 单元。
推荐阅读
- ada - Ada - 星期几
- r - 如何在字符串外部和内部设置单引号应保持双引号
- c - 将节点插入 BST 会更改以前的节点
- time - JS 将星期选择器更改为月份
- vue.js - 未捕获的类型错误:_ctx。不是一个函数 [VueJS 3]
- java - 使用 application/zip 作为内容类型时的 Swagger codegen 异常
- websocket - API Gateway 响应时间问题
- azure - 在带有令牌的 Azure 应用程序 url 上调用 WebRequest
- postgresql - 无法使用 PostgresSQL 安装 Strapi
- c++ - /tmp/ccPxME98.o:在函数“main”中: