Saya perlu meningkatkan skrip Bash saya agar berjalan dengan sempurna tanpa masalah. Script ini digunakan ds4drv
di dalamnya dan memiliki beberapa masalah yang saya tidak yakin tentang cara memperbaikinya.
Masalah pertama adalah bahwa itu tidak selalu berjalan atau bekerja ketika controller terdeteksi, saya telah membuat aturan udev untuk itu tetapi tidak jelas mengapa itu tidak selalu menjalankan skrip ini ketika terdeteksi.
Masalah kedua, ds4drv
hanya bisa dijalankan sebagai root saja, bukannya dijalankan sebagai pengguna biasa.
Masalah ketiga, saya tidak tahu cara yang tepat untuk berurusan dengan file kunci PID begitu mereka telah dibuat, sehingga ketika proses PID tidak ada lagi menghapus file kunci PID setelah. Sulit menemukan dokumentasi yang tepat tentang cara menggunakan file PID dalam skrip bash sehingga hanya ada 1 instance yang berjalan.
Inilah aturan udev saya untuk 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"
Saya cukup yakin seperti itulah seharusnya aturan udev, izin tampaknya benar bagi saya karena ini baca-tulis untuk pengguna GROUP. Tampaknya ada beberapa contoh masalah yang ketika skrip bash saya telah berjalan dan aturan ini diatur untuk berjalan secara otomatis ketika perangkat pengontrol terhubung, bahwa beberapa permainan menjadi tidak responsif seperti tidak ada perangkat pengontrol yang terhubung saat ada, itu anggaplah untuk bertindak /dev/js0
tetapi sebaliknya bertindak /dev/js1
sebagai gantinya. Ini mungkin sering mengembalikan kesalahan ini khususnya jika tidak dijalankan sebagai root;
OSError: [Errno 13] Permission denied: '/dev/input/event17'
dan skrip bash tentu saja; 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
adalah kelemahan keamanan lokal (penghapusan file sewenang-wenang terhadap skrip yang dijalankan pengguna), lebih baik digunakan /var/run
atau semacamnya. File PID sebaliknya hanya akan menjadi solusi biasa dengan case tepi dan gotcha, tergantung pada bagaimana hal-hal berantakan.