我在 Arch Linux 安装上使用 bspwm,并且需要运行 sxhkd 热键守护进程来启动我的应用程序。
到目前为止,启动脚本位于我的 .config/bspwm/bspwmrc (这是一个简单的 bash 脚本文件)中:
# Keyboard bindings manager
pkill sxhkd
sxhkd -m 1&
争论-m 1
是因为我没有 qwerty 键盘。
当我自动登录时,bspwmrc 脚本由我的显示管理器 LightDM 执行。到目前为止一切顺利。
正在阅读拱门维基,我意识到我可以直接用Systemd启动sxhkd。甚至还有一个关联样本服务文件;其中包含:
[Unit]
Description=Simple X Hotkey Daemon
Documentation=man:sxhkd(1)
BindsTo=display-manager.service
After=display-manager.service
[Service]
ExecStart=/usr/bin/sxhkd
ExecReload=/usr/bin/kill -SIGUSR1 $MAINPID
[Install]
WantedBy=graphical.target
所以我想知道,为什么不呢?并将 sxhkd.service 文件复制到/etc/systemd/system
(添加 -m 1 参数后),使用 启用服务sudo systemctl enable sxhkd
,注释 bspwmrc 脚本中的行,然后重新启动。
唉,这行不通。当输入 时systemctl status sxhkd
,我收到此错误消息:
Warning: The unit file, source configuration file or drop-ins of sxhkd.service changed on disk. Run 'systemctl daemon-rel>
● sxhkd.service - Simple X Hotkey Daemon
Loaded: loaded (/etc/systemd/system/sxhkd.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Fri 2020-07-24 10:29:05 CEST; 14min ago
Docs: man:sxhkd(1)
Main PID: 662 (code=exited, status=1/FAILURE)
Jul 24 10:29:05 Solgaleo systemd[1]: Started Simple X Hotkey Daemon.
Jul 24 10:29:05 Solgaleo sxhkd[662]: Can't open display.
Jul 24 10:29:05 Solgaleo systemd[1]: sxhkd.service: Main process exited, code=exited, status=1/FAILURE
Jul 24 10:29:05 Solgaleo systemd[1]: sxhkd.service: Failed with result 'exit-code'.
我的理解是,这Can't open display
意味着 sxhkd 开始得太早......我不知道为什么,也不知道如何解决这个问题。
我知道我可以回到以前的配置,但如果 Arch Wiki 上有一些东西不起作用,我宁愿找出是否是我的错或者 Wiki 是否需要更新。
编辑:
进一步调查表明,以 root 身份运行 sxhkd 无法工作。
这是我改变的:
我将 sxhkd.service 文件从 移动/etc/systemd/system
到/etc/systemd/user
并通过命令启用它systemctl --user enable sxhkd
。
这仍然不起作用,但有不同的错误消息:
Failed to start sxhkd.service: Unit display-manager.service not found.
键入systemctl status display-manager
给出:
● lightdm.service - Light Display Manager
Loaded: loaded (/usr/lib/systemd/system/lightdm.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2020-07-25 11:11:07 CEST; 10min ago
Docs: man:lightdm(1)
Main PID: 602 (lightdm)
Tasks: 4 (limit: 38412)
Memory: 63.7M
CGroup: /system.slice/lightdm.service
├─602 /usr/bin/lightdm
└─666 /usr/lib/Xorg -bs -core :0 -seat seat0 -auth /run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
Jul 25 11:11:05 Solgaleo systemd[1]: Starting Light Display Manager...
Jul 25 11:11:07 Solgaleo lightdm[602]: Error getting user list from org.freedesktop.Accounts: GDBus.Error:org.freedesktop>
Jul 25 11:11:07 Solgaleo systemd[1]: Started Light Display Manager.
Jul 25 11:11:08 Solgaleo lightdm[670]: pam_succeed_if(lightdm-autologin:auth): requirement "user ingroup autologin" was m>
Jul 25 11:11:08 Solgaleo lightdm[670]: Error getting user list from org.freedesktop.Accounts: GDBus.Error:org.freedesktop>
Jul 25 11:11:08 Solgaleo lightdm[670]: pam_unix(lightdm-autologin:session): session opened for user ben by (uid=0)
lines 1-17/17 (END)
这意味着显示管理器正在正常运行。也许用 启动的服务看不到它--user
?
编辑2:
和BindsTo
实际上After
不是必需的:服务是作为用户启动的,因此是在用户会话启动之后。但如果我删除它们,该服务在启动时根本不会启动。如果我手动启动它,效果会很好。
编辑3:
有关我所执行的步骤的更多详细信息,请参见此处:https://bbs.archlinux.org/viewtopic.php?id=257626&p=2
答案1
您概述的方法是不可能的,或者至少据我所知是不可能的。考虑以下反例:如果您有多头设置,您将登录两次。您systemd
将启动热键守护程序的一份副本。现在,系统的两个用户之一按下了热键。谁在屏幕上看到结果? ;)
因此,最好的方法是让会话启动热键守护进程。简单的方法是使用窗口管理器的启动脚本,就像您之前所做的那样。更现代的方法是让某种用户会话事物来管理它,这实际上取决于您的系统和窗口管理器的设置。根据我的经验,这总是有点偶然,并且没有很好的记录,而启动脚本非常简单。
可以在此处查看如何编写 dbus 服务文件的一个示例:https://serverfault.com/a/906224/107282。虽然您提到的守护进程不需要 dbus,但它应该允许它在适当的时间使用配置的DISPLAY
变量启动。