将 kbd 作为 systemd 的服务

将 kbd 作为 systemd 的服务

不久前,我询问如何在屏幕锁定时停止音乐播放器。答案是使用 actkbd,它的作用就像一个魅力。现在我想将 actkbd 作为服务添加到 systemd 中,以便在启动时自动启动它。正如您所看到的,服务已正确启动,并且它也显示在 htop 中。下面是一些输出:

[root@hostname init.d]# systemctl start actkbd.service
[root@hostname init.d]# systemctl status actkbd.service
actkbd.service - Actkbd: Daemon for X-independent shortcuts
      Loaded: loaded (/etc/systemd/system/multi-user.target.wants/actkbd.service)
      Active: active (running) since Tue, 10 Apr 2012 17:50:36 +0200; 2s ago
     Process: 23526 ExecStart=/usr/local/sbin/actkbd -d /dev/input/event3 -D (code=exited, status=0/SUCCESS)
    Main PID: 23527 (actkbd)
      CGroup: name=systemd:/system/actkbd.service
              └ 23527 /usr/local/sbin/actkbd -d /dev/input/event3 -D
[root@hostname init.d]# systemctl stop actkbd.service
[root@hostname init.d]# ps -C actkbd
  PID TTY          TIME CMD

我有以下actkbd.service文件/etc/systemd/system/multi-user.target.wants/

[Unit]
Description=Actkbd: Daemon for X-independent shortcuts

[Service]
Type=forking
ExecStart=/usr/local/sbin/actkbd -d /dev/input/event3 -D
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -15 $MAINPID
Restart=always
User=root

所以问题是,在使用 systemctl 启动服务后,如果我按常用的暂停 Rhythmbox 的快捷键,什么也不会发生。如果我只是/usr/local/sbin/actkbd -d /dev/input/event3 -D通过根终端执行命令,一切都会正常。为什么?

抱歉,如果这是显而易见的事情,我是 systemd 业务的新手,但我找不到任何对我有帮助的东西。

干杯。

编辑:这仍然不起作用。如果有人有时间尝试并重现它,我将不胜感激。如果可能的话,我将提交错误报告。

答案1

如果您希望用户能够访问设备并运行服务单元,那么您需要制定udev规则并设置适当的MODES权限以允许用户访问设备。简单地启动单元文件是User=root不正确的,因为您不是以 root 身份运行会话,而是以您的用户身份运行会话。当您从根终端运行它时,您正在从用户会话内部激活根终端。要获得有关此内容的更多信息,请查找 上的信息systemd --user

整理 udev 规则

使用以下命令为您提供填充udev规则所需的信息:

udevadm info --path=$(udevadm info -q path -n /dev/input/event3)

从上述命令的输出中创建您的 udev 规则/etc/udev/rules.d/<device>.conf。在您喜欢的文本编辑器中打开它并填写变量

 SUBSYSTEM=="device",
 SYSFS{idVendor}=="ID Vendor Here" ,
 SYSFS{idProduct}=="ID Model Here",
 MODE="666"

有关制作和命名udev规则的更多信息,请参阅man udev您的 Linux 发行版的 Wiki。设置规则后,重新启动。然后登录 X 后启动设备。

另外,这里有一个很多比您提供的文件更健全的系统单元文件。

[Unit]
Description=Actkbd: Daemon for X-independent shortcuts

[Service]
ExecStart=/usr/sbin/actkbd -Dd /dev/input/event3
RemainAfterExit=yes
Type=forking
Restart=always

相关内容