我在Arch安装上使用bspwm,我需要运行sxhkd热键守护进程来启动我的应用程序。
到目前为止,启动脚本位于我的. .config/bspwm/bspwmrc (这是一个简单的bash脚本文件):
# Keyboard bindings manager
pkill sxhkd
sxhkd -m 1&存在-m 1参数,因为我没有qwerty键盘。
bspwmrc脚本在自动登录我时由我的显示管理器LightDM执行。到目前一切尚好。
阅读Arch Wiki后,我意识到可以直接使用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需要更新。
进一步研究表明,将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发布的服务看不到它?
实际上,BindsTo和After并不是必需的:服务是以用户身份启动的,因此在用户会话启动之后。但是,如果我删除它们,服务在启动时根本不会启动。不过,如果我手动启动它,效果会很好。
关于我在这里所遵循的步骤的更多细节:https://bbs.archlinux.org/viewtopic.php?id=257626&p=2
发布于 2020-07-29 07:01:00
你概述的方法是不可能的,至少,据我所知是不可能的。考虑以下反例:如果您有一个多头设置,您将登录两次。您的systemd将启动热键守护进程的一个副本。现在,您的系统的两个用户之一按下一个热键。谁在屏幕上得到结果?)
因此,最好的方法是让会话启动热键守护进程。简单的方法是像以前一样使用窗口管理器的启动脚本。更现代的方法是让某种用户会话管理这一点,这实际上取决于您的系统和窗口管理器的设置。在我的经验中,这总是有点失败,没有很好的文档,而启动脚本是相当简单的。
在这里可以看到如何编写dbus服务文件的一个示例:https://serverfault.com/a/906224/107282。虽然您提到的守护进程不需要dbus,但它应该允许它使用配置好的DISPLAY变量在适当的时间启动。
https://unix.stackexchange.com/questions/600119
复制相似问题