基本背景信息:
我正在尝试在os启动时运行我的程序(我目前的操作系统是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
我收到以下错误May 08 11:49:43 debian keyboard_listener.py [303]:档案 “/usr/local/lib/python3.5/dist-packages/Xlib/protocol/display.py” 第90行,在 init
中May 08 11:49:43 debian keyboard_listener.py [303]: self.socket = connect.get_socket(name,protocol,host,displayno)
May 08 11:49:43 debian keyboard_listener.py [303]:档案 “/usr/local/lib/python3.5/dist-packages/Xlib/support/connect.py”,行 87,在get_socket
中May 08 11:49:43 debian keyboard_listener.py [303]:返回 mod.get_socket(dname,protocol,host,dno)
May 08 11:49:43 debian keyboard_listener.py [303]:档案 “/usr/local/lib/python3.5/dist-packages/Xlib/support/unix_connect.py” 第113行,在get_socket
中May 08 11:49:43 debian keyboard_listener.py [303]:加注 error.DisplayConnectionError(dname,str(val))
May 08 11:49:43 debian keyboard_listener.py [303]: Xlib.error.DisplayConnectionError:无法连接显示“:0”: [Errno 111]拒绝连接
May 08 11:49:43 debian systemd [1]: my_project.service:Main 进程退出,代码=退出,状态= 1 /失败
May 08 11:49:43 debian systemd [1]: my_project.service:Unit 进入失败状态。
May 08 11:49:43 debian systemd [1]: my_project.service:失败 结果'退出代码'。
我该如何解决这个问题(Erron 111)?我应该向my_project.service添加一些东西 如何让我的项目在启动时运行?
答案 0 :(得分:1)
systemd
将不起作用如果没有明确的排序依赖关系,systemd
会同时处理事务中的所有单元。这意味着在启动.service
单元之前,它不会也不会等待X服务器显示:0。
在现代GNU / Linux发行版中,X服务器不是由任何systemd单元直接启动的,因此您无法在X服务器上指定systemd排序依赖项。因此systemd
不适合你想要完成的任何事情,至少在systemd中实现更细粒度的依赖机制之前是这样。
作为一种变通方法,您可以尝试/etc/xdg/autostart
,~/.config/autostart
或~/.xinitrc
(适用于您的X.org设置的任何内容)。保证这些脚本可以在图形用户会话中运行。
如果需要状态监控,您可以组合这两种方法,并从其中一个脚本中启动一个带有systemd-run
(1)或等效的瞬态系统单元。