Necesito ayuda para mejorar mi script Bash

Necesito ayuda para mejorar mi script Bash para que funcione perfectamente sin problemas. Este script usa ds4drv y tiene algunos problemas que no estoy seguro de cómo corregirlos.

El primer problema es que no siempre se ejecuta o funciona cuando se detecta el controller, creé una regla udev para ello, pero no está claro por qué no siempre se ejecuta este script cuando se detecta.

Segundo problema, ds4drv solo se puede ejecutar como root solamente, en lugar de ejecutarse como usuario normal.

Tercero, no sé cómo manejar los files de locking PID una vez que se han creado, de modo que cuando el process PID ya no exista, se elimine el file de locking PID. Es difícil encontrar la documentation adecuada sobre cómo usar files PID en scripts bash, de modo que solo pueda haber 1 instancia en ejecución.

Aquí está mi regla de udev para ds4drv: 50-ds4drv.rules

 KERNEL=="uinput", GROUP="users", MODE="0666" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="05c4", GROUP="users", MODE="0 666" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", KERNELS=="0005:054C:05C4.*", GROUP="users" MODE="0666" ACTION=="add", SUBSYSTEM="usb", ATTRS{idProduct}=="054c", RUN+="/home/user/scripts/ds4check.sh", GROUP="users" , MODE="0666" 

Estoy bastante seguro de que así es como debería ser la regla de udev, los permissions parecen ser correctos para mí, ya que son de lectura y escritura para los usuarios de GROUP. Parece que hay una instancia de un problema que una vez que mi script bash se ha ejecutado y esta regla está configurada para ejecutarse automáticamente cuando el dispositivo controller está conectado, algunos juegos dejan de responder como que no hay un dispositivo controller conectado cuando existe, se supone para actuar en /dev/js0 pero en cambio actúa en /dev/js1 en /dev/js1 lugar. A menudo puede devolver este error en particular si no se ejecuta como root;

 OSError: [Errno 13] Permission denied: '/dev/input/event17' 

y el guión bash por supuesto; ds4check.sh

 #!/bin/bash # DS4 Check Script pidfile=/tmp/ds4drv.pid # check if process is already running for pid in $(pidof -x /home/user/scripts/ds4check.sh $pidfile); do if [ $pid != $$ ]; then echo "[$(date)] : ds4check.sh : Proccess is already running with PID $pid" >> /home/user/.cache/ds4drv.log exit 1 # if not running then run and apply config else ( ds4drv --hidraw --config /home/user/.config/ds4drv.conf ) exit 0 fi done # remove PID file on exit... hopefully trap "srm -rv -- '$pidfile'" EXIT >> /home/user/.cache/ds4drv.log 

Me preocupan 2 puntos

  • Archivos PID con los que no estoy familiarizado, pero sugeriría utilizar pgrep como solución alternativa.
  • ds4drv parece un daemon, pero udev solo admite processs de ejecución cortos.

    EJECUTAR {tipo}

    Esto solo se puede usar para tareas de primer plano de ejecución muy corta. La ejecución de un process de evento durante un período prolongado de time puede bloquear todos los events posteriores de este o de un dispositivo dependiente.

    Iniciar daemons u otros processs de larga ejecución no es apropiado para udev; los processs bifurcados, separados o no, serán eliminados incondicionalmente después de que el event handlingl evento haya finalizado.

Haga una copy de esa secuencia de commands:

 #!/bin/bash # DS4 Check Script pgrep ds4drv || ds4drv --hidraw --config /home/user/.config/ds4drv.conf & disown