使用systemd

时间:2018-05-08 12:26:56

标签: python-3.x systemd

  • 基本背景信息:

    我正在尝试在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添加一些东西 如何让我的项目在启动时运行?

1 个答案:

答案 0 :(得分:1)

tl; dr:systemd将不起作用

如果没有明确的排序依赖关系,systemd会同时处理事务中的所有单元。这意味着在启动.service单元之前,它不会也不会等待X服务器显示:0。

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

建议的解决方法

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

如果需要状态监控,您可以组合这两种方法,并从其中一个脚本中启动一个带有systemd-run(1)或等效的瞬态系统单元。