自定义 Systemd 服务未完成激活

自定义 Systemd 服务未完成激活

这一页Arch Wiki 上描述了一个可以调整 tty 中的键盘重复率的 systemd 单元,我已将其写入我的主目录中并符号链接到以下目录:

/etc/systemd/system/kbdrate.service
-----------------------------------
[Unit]
Description=Keyboard repeat rate in tty.

[Service]
Type=oneshot
RemainAfterExit=yes
StandardInput=tty
StandardOutput=tty
ExecStart=/usr/bin/kbdrate --silent --delay 250 --rate 30
 
[Install]
WantedBy=multi-user.target

并运行以下命令来启用它并立即开始运行:

# systemctl daemon-reload
# systemctl enable --now kbdrate.service

该命令将开始运行,直到超时才会停止,并给出超时错误# journalctl(编辑:这种情况曾经在对脚本进行一些更改时发生过一次,但对于上述版本,它只是无限期地继续“激活”)。在此期间,systemctl status服务的显示该服务已从正确的目录加载,正在激活,唯一的输出是systemd[1]: Starting Keyboard repeat rate in tty....

我尝试了将其转变为用户服务、设置Type=simple、、(删除参数)等各种组合并使其运行,RemainAfterExit=no但都无济于事。ExecStart=/usr/bin/kbdrateWantedBy=default.target

# kbdrate命令本身运行良好,并且将其设置为用户服务会失败,因为Permission denied设置标准输入和生成时/usr/bin/kbdrate,因此看起来该服务至少能够运行该kbdrate命令。

所以最后我的问题是,我做错了什么?我是否应该查看其他日志文件来查找错误?

答案1

Arch BBS 上有讨论这里该问题已得到解决。

相关帖子:

该脚本应该只是启用,以便可以在登录终端之前运行。如果你读过 systemd.service(5) 和 systemd.exec(5),你会发现以下几行的组合

StandardInput=tty Type=oneshot 在此处出现错误。由于 tty 已被您的用户会话使用,systemd 服务会等待您的 tty 空闲(这永远不会发生)后再执行 ExecStart。要使 oneshot 类型的单元被视为已启动,ExecStart 启动的任何单元都必须先退出。

这意味着:systemd 永远无法获取 tty -> ExecStart 永远不会被调用 -> 该服务永远不会被视为已启动 -> systemctl 等待直到服务启动 -> systemctl 永远不会返回。

在启动/打开新的 tty 时这不是问题,因为服务将在您的会话在 tty 上运行之前启动,您不应该真正担心这一点,只需启用该服务并继续您的生活

基本上,您无法在登录时运行此命令。您需要启用它,然后重新启动才能生效,因为它需要在您登录控制台之前运行。

相关内容