Devo migliorare il mio script Bash in modo che funzioni perfettamente senza problemi. Questo script lo utilizza ds4drv
e presenta alcuni problemi che non sono sicuro su come correggere.
Il primo problema è che non viene sempre eseguito o funziona quando viene rilevato il controller, ho creato una regola udev per esso, ma non è chiaro il motivo per cui non esegue sempre questo script quando viene rilevato.
Secondo problema, ds4drv
può essere eseguito solo come root, invece di essere eseguito come utente normale.
Terzo problema, non conosco il modo corretto di gestire i file di blocco PID dopo che sono stati creati, quindi quando il processo PID non esiste più elimina il file di blocco PID dopo. È difficile trovare la documentazione corretta su come usare i file PID negli script bash in modo che ci possa essere solo 1 istanza in esecuzione.
ecco la mia regola udev per 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"
Sono abbastanza sicuro che dovrebbe essere così come dovrebbe essere la regola udev, le autorizzazioni sembrano essere corrette per me dal momento che è in lettura-scrittura per gli utenti di GROUP. Sembra esserci qualche istanza di un problema che una volta eseguito il mio script bash e questa regola è impostata per essere eseguita automaticamente quando il dispositivo controller è collegato, che alcuni giochi non rispondono come se non ci fosse alcun dispositivo controller collegato quando c'è, supponiamo di agire /dev/js0
ma invece di agire /dev/js1
invece. Spesso può restituire questo errore in particolare se non viene eseguito come root;
OSError: [Errno 13] Permission denied: '/dev/input/event17'
e lo script bash ovviamente; 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
è un difetto di sicurezza locale (eliminazione arbitraria dei file contro l'utente che esegue lo script), migliore da usare /var/run
o simile. In caso contrario, i file PID saranno una soluzione così semplice con casi limite e problemi, a seconda di come le cose vanno in pezzi.