Actkbd как служба с systemd

Actkbd как служба с 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через root-терминал, все работает нормально. Почему так?

Извините, если это очевидно, я новичок в работе с systemd, но не смог найти ничего, что мне помогло бы.

Ваше здоровье.

EDIT: Это все еще не работает. Если у кого-то есть время, я был бы признателен, если бы кто-то попытался воспроизвести это. Если это возможно, то я отправлю отчет об ошибке.

решение1

Если вы хотите, чтобы пользователь мог получить доступ к устройству и запустить сервисный модуль, то вам нужно создать правило udevи установить правильное MODESразрешение для разрешения пользователю на доступ к устройству. Простой запуск файла модуля как User=rootнекорректен, поскольку вы не запускаете сеанс как root, а как ваш пользователь. Когда вы запускаете его из терминала 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или Wiki вашего дистрибутива Linux. После установки правил перезагрузите компьютер. А затем запустите устройство после входа в X.

Также, вотмногоболее вменяемый файл системного модуля, чем тот, который вы предоставили.

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

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

Связанный контент