Preciso melhorar meu script Bash para que ele funcione perfeitamente sem problemas. Este script usa ds4drv
nele e tem alguns problemas que não tenho certeza sobre como corrigir.
A primeira questão é que nem sempre é executado ou funciona quando o controlador é detectado, eu criei uma regra do udev para ele, mas não está claro por que ele nem sempre executa esse script quando é detectado.
Segundo problema, ds4drv
só pode ser executado como root, em vez de ser executado como usuário normal.
Terceiro problema, não sei a maneira correta de lidar com os arquivos de bloqueio do PID depois que eles foram criados, para que, quando o processo do PID não exista mais, ele apague o arquivo de bloqueio do PID. É difícil encontrar a documentação adequada sobre como usar arquivos PID em scripts bash, para que possa haver apenas uma instância em execução.
aqui está minha regra do 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"
Tenho certeza que é assim que deve ser a regra do udev, as permissões parecem corretas para mim, pois é de leitura e gravação para usuários do GROUP. Parece haver algum exemplo de problema que, uma vez que meu script bash é executado e esta regra é definida para ser executada automaticamente quando o dispositivo controlador está conectado, que alguns jogos ficam sem resposta, como se não houvesse um dispositivo controlador conectado quando houver, é suposto para agir, /dev/js0
mas em vez disso age /dev/js1
. Geralmente, esse erro pode retornar, em particular, se não for executado como root;
OSError: [Errno 13] Permission denied: '/dev/input/event17'
e o script bash, é claro; 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
é uma falha de segurança local (exclusão arbitrária de arquivos contra o script em execução do usuário), melhor para usar /var/run
ou algo assim. Caso contrário, os arquivos PID serão apenas uma solução mais ou menos com casos extremos e dicas, dependendo de como as coisas desmoronam.