首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能将sxhkd作为系统d服务启动。

不能将sxhkd作为系统d服务启动。
EN

Unix & Linux用户
提问于 2020-07-24 08:59:14
回答 1查看 2.6K关注 0票数 1

我在Arch安装上使用bspwm,我需要运行sxhkd热键守护进程来启动我的应用程序。

到目前为止,启动脚本位于我的. .config/bspwm/bspwmrc (这是一个简单的bash脚本文件):

代码语言:javascript
复制
# Keyboard bindings manager
pkill sxhkd
sxhkd -m 1&

存在-m 1参数,因为我没有qwerty键盘。

bspwmrc脚本在自动登录我时由我的显示管理器LightDM执行。到目前一切尚好。

阅读Arch Wiki后,我意识到可以直接使用Systemd启动sxhkd。甚至还有一个示例服务文件的链接;它包含:

代码语言:javascript
复制
[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时,我会收到以下错误消息:

代码语言:javascript
复制
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命令启用它。

这仍然不起作用,但是有一个不同的错误消息:

代码语言:javascript
复制
Failed to start sxhkd.service: Unit display-manager.service not found. 

输入systemctl status display-manager可以得到:

代码语言:javascript
复制
● 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发布的服务看不到它?

Edit2:

实际上,BindsToAfter并不是必需的:服务是以用户身份启动的,因此在用户会话启动之后。但是,如果我删除它们,服务在启动时根本不会启动。不过,如果我手动启动它,效果会很好。

Edit3:

关于我在这里所遵循的步骤的更多细节:https://bbs.archlinux.org/viewtopic.php?id=257626&p=2

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-07-29 07:01:00

你概述的方法是不可能的,至少,据我所知是不可能的。考虑以下反例:如果您有一个多头设置,您将登录两次。您的systemd将启动热键守护进程的一个副本。现在,您的系统的两个用户之一按下一个热键。谁在屏幕上得到结果?)

因此,最好的方法是让会话启动热键守护进程。简单的方法是像以前一样使用窗口管理器的启动脚本。更现代的方法是让某种用户会话管理这一点,这实际上取决于您的系统和窗口管理器的设置。在我的经验中,这总是有点失败,没有很好的文档,而启动脚本是相当简单的。

在这里可以看到如何编写dbus服务文件的一个示例:https://serverfault.com/a/906224/107282。虽然您提到的守护进程不需要dbus,但它应该允许它使用配置好的DISPLAY变量在适当的时间启动。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/600119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档