Ich muss mein Bash-Skript verbessern, damit es fehlerfrei und ohne Probleme ausgeführt wird. Dieses Skript verwendet ds4drv
es und es gibt einige Probleme, deren Korrektur ich nicht sicher bin.
Das erste Problem ist, dass es nicht immer ausgeführt wird oder funktioniert, wenn der Controller erkannt wird. Ich habe eine udev-Regel dafür erstellt, aber es ist nicht klar, warum dieses Skript nicht immer ausgeführt wird, wenn es erkannt wird.
Das zweite Problem ds4drv
kann nur als Root ausgeführt werden, anstatt als normaler Benutzer.
Drittes Problem: Ich kenne den richtigen Umgang mit PID-Sperrdateien nach deren Erstellung nicht. Wenn der PID-Prozess nicht mehr vorhanden ist, wird die PID-Sperrdatei danach gelöscht. Es ist schwierig, eine angemessene Dokumentation zur Verwendung von PID-Dateien in Bash-Skripten zu finden, sodass nur eine Instanz ausgeführt werden kann.
Hier ist meine udev-Regel für 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"
Ich bin mir ziemlich sicher, dass die udev-Regel so aussehen sollte. Berechtigungen scheinen mir korrekt zu sein, da sie für GROUP-Benutzer gelesen und geschrieben werden. Es scheint ein Problem zu geben, bei dem, sobald mein Bash-Skript ausgeführt wurde und diese Regel automatisch ausgeführt wird, wenn das Controller-Gerät angeschlossen ist, einige Spiele nicht mehr reagieren, da kein Controller-Gerät angeschlossen ist, wenn es vorhanden ist zu handeln, /dev/js0
sondern stattdessen zu handeln /dev/js1
. Dieser Fehler kann häufig zurückgegeben werden, insbesondere wenn er nicht als root ausgeführt wird.
OSError: [Errno 13] Permission denied: '/dev/input/event17'
und das Bash-Skript natürlich; 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
ist eine lokale Sicherheitslücke (willkürliches Löschen von Dateien gegen Benutzer, die ein Skript ausführen), besser zu verwenden /var/run
oder dergleichen. Ansonsten sind PID-Dateien nur eine mittelmäßige Lösung mit Randfällen und Fallstricken, je nachdem, wie die Dinge auseinanderfallen.