Actkbd als Dienst mit systemd

Actkbd als Dienst mit systemd

Vor einiger Zeit habe ich gefragt, wie man einen Musikplayer stoppt, während der Bildschirm gesperrt ist. Die Antwort war, actkbd zu verwenden, was wunderbar funktioniert. Jetzt wollte ich actkbd als Dienst zu systemd hinzufügen, um es beim Booten automatisch zu starten. Wie Sie sehen, wird der Dienst also korrekt gestartet und erscheint auch in htop. Nachfolgend einige Ausgaben:

[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

Ich habe die folgende actkbd.serviceDatei in/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

Das Problem ist also, dass nach dem Starten des Dienstes mit systemctl nichts passiert, wenn ich meine übliche Tastenkombination zum Pausieren von Rhythmbox drücke. Wenn ich den Befehl stattdessen einfach /usr/local/sbin/actkbd -d /dev/input/event3 -Düber ein Root-Terminal ausführe, funktioniert alles einwandfrei. Warum ist das so?

Entschuldigen Sie, wenn es offensichtlich ist, ich bin neu im Systemd-Geschäft, konnte aber nichts finden, was mir geholfen hat.

Prost.

EDIT: Das funktioniert immer noch nicht. Wenn jemand etwas Zeit hat, wäre ich dankbar, wenn er versuchen könnte, es zu reproduzieren. Wenn das möglich ist, werde ich einen Fehlerbericht einreichen.

Antwort1

Wenn Sie möchten, dass der Benutzer auf das Gerät zugreifen und die Serviceeinheit ausführen kann, müssen Sie eine udevRegel erstellen und die entsprechenden Einstellungen vornehmen MODES, um dem Benutzer die Berechtigung zum Zugriff auf das Gerät zu erteilen. Das einfache Starten der Unit-Datei als User=rootist falsch, da Sie die Sitzung nicht als Root, sondern als Ihr Benutzer ausführen. Wenn Sie sie von einem Root-Terminal aus ausführen, aktivieren Sie ein Root-Terminal innerhalb Ihrer Benutzersitzung. Weitere Informationen hierzu finden Sie unter systemd --user.

Zusammenstellen einer Udev-Regel

Verwenden Sie den folgenden Befehl, um die Informationen zu erhalten, die Sie zum Ausfüllen der udevRegel benötigen:

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

Erstellen Sie aus der Ausgabe des obigen Befehls Ihre udev-Regel in /etc/udev/rules.d/<device>.conf. Öffnen Sie sie in Ihrem bevorzugten Texteditor und füllen Sie die Variablen aus

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

Weitere Informationen zum Erstellen und Benennen udevvon Regeln finden Sie im man udevWiki Ihrer Linux-Distribution. Führen Sie nach dem Festlegen der Regeln einen Neustart durch. Starten Sie das Gerät anschließend neu, nachdem Sie sich bei X angemeldet haben.

Außerdem gibt es hier einevielvernünftigere Systemunit-Datei als die, die Sie bereitgestellt haben.

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

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

verwandte Informationen