將 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

相關內容