Actkbd como servicio con systemd

12

Hace un tiempo, pregunté cómo detener un reproductor de música mientras la pantalla está bloqueada. La respuesta fue usar actkbd que funciona de maravilla. Ahora quería agregar actkbd como un servicio a systemd para iniciarlo automáticamente al arrancar. Como puede ver, el servicio se inicia correctamente y también se muestra en htop. Algunos resultados a continuación:

[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

Tengo el siguiente actkbd.servicearchivo en/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

Entonces, el problema es que después de iniciar el servicio con systemctl no pasa nada si presiono mi acceso directo habitual para pausar Rhythmbox. Si en su lugar solo ejecuto el comando a /usr/local/sbin/actkbd -d /dev/input/event3 -Dtravés de un terminal raíz, todo funciona bien. ¿Por qué eso?

Lo siento si es algo obvio, soy nuevo en el negocio de systemd pero no pude encontrar nada que me ayudara.

Salud.

EDITAR: Esto todavía no funciona. Si alguien tiene algo de tiempo, agradecería que uno pudiera intentar reproducirlo. Si eso es posible, entonces presentaré un informe de error.

Azrael3000
fuente
Todavía tengo que tratar actkbdcon systemd, debido a la falta de tiempo, pero sospecho que su problema tiene que ver con actkbdque se inició antes de que el sistema de entrada está totalmente inicializado - actkbdfunciona bien cuando se inicia como un servicio de LSB en mi portátil desarrollo. Debe asegurarse de que se inicie después de iniciar el evdevmódulo y de que su teclado siempre tenga el mismo eventXnodo de dispositivo.
thkala
Gracias por la respuesta Theodoros. Las pruebas que mostré arriba se ejecutaron mientras todo se iniciaba. Entonces, en teoría, todos los módulos deberían cargarse. El nodo del dispositivo también debería estar bien, ya que ejecutar el comando manualmente funciona bien todo el tiempo.
Azrael3000

Respuestas:

5

Si desea que el usuario pueda acceder al dispositivo y ejecutar la unidad de servicio, entonces deberá establecer una udevregla y establecer la adecuada MODESpara permitirle al usuario permiso para acceder al dispositivo. Simplemente iniciar el archivo de la unidad como User=rootincorrecto ya que no está ejecutando la sesión como root sino como su usuario. Cuando lo ejecuta desde un terminal raíz, está activando un terminal raíz desde la sesión de sus usuarios. Para obtener más información sobre esto, busque información sobre systemd --user.

Preparando una regla udev

Use el siguiente comando para darle la información que necesitará para completar la udevregla:

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

De la salida del comando anterior, cree su regla udev en /etc/udev/rules.d/<device>.conf. Ábralo en su editor de texto favorito y complete las variables

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

Para obtener más información sobre udevcómo hacer y nombrar reglas, consulte man udevel Wiki de su distribución de Linux. Después de establecer las reglas, reinicie. Y luego inicie la unidad una vez que haya iniciado sesión en X.

Además, aquí hay un archivo de unidad de sistema mucho más sano que el que ha proporcionado.

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

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