这一页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/kbdrate
WantedBy=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 上运行之前启动,您不应该真正担心这一点,只需启用该服务并继续您的生活
基本上,您无法在登录时运行此命令。您需要启用它,然后重新启动才能生效,因为它需要在您登录控制台之前运行。