
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.service
Datei 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 udev
Regel 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=root
ist 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 udev
Regel 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 udev
von Regeln finden Sie im man udev
Wiki 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