Necesito mejorar mi script Bash para que funcione sin problemas sin problemas. Este script lo utiliza ds4drv
y tiene algunos problemas que no estoy seguro de cómo corregir.
El primer problema es que no siempre se ejecuta o no funciona cuando se detecta el controlador, había creado una regla udev para él, pero no está claro por qué no siempre ejecuta este script cuando se detecta.
Segundo problema, ds4drv
solo se puede permitir que se ejecute solo como root, en lugar de ejecutarse como usuario normal.
Tercer problema, no conozco la forma correcta de tratar con los archivos de bloqueo PID una vez que se han creado, de modo que cuando el proceso PID ya no existe, elimina el archivo de bloqueo PID después. Es difícil encontrar la documentación adecuada sobre cómo usar los archivos PID en los scripts de bash, por lo que solo puede haber una 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 permisos parecen ser correctos para mí, ya que es de lectura y escritura para usuarios de GROUP. Parece haber 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 se conecta el dispositivo controlador, que algunos juegos dejan de responder como si no hubiera ningún dispositivo controlador conectado cuando lo hay, se supone para actuar /dev/js0
pero en su lugar actúa en su /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
/tmp
es una falla de seguridad local (eliminación arbitraria de archivos contra el script que ejecuta el usuario), mejor usar /var/run
o tal. De lo contrario, los archivos PID solo serán una solución regular con casos extremos y problemas, dependiendo de cómo se desmoronen las cosas.