Tôi cần cải thiện tập lệnh Bash của mình để nó chạy hoàn hảo mà không gặp vấn đề gì. Kịch bản này sử dụng ds4drv
trong nó và nó có một số vấn đề mà tôi không chắc về cách sửa.
Vấn đề đầu tiên là nó không luôn chạy hoặc hoạt động khi bộ điều khiển được phát hiện, tôi đã tạo quy tắc udev cho nó nhưng không rõ tại sao nó không luôn chạy tập lệnh này khi phát hiện ra.
Vấn đề thứ hai, ds4drv
chỉ có thể được phép chạy dưới quyền root, thay vì được chạy như người dùng bình thường.
Vấn đề thứ ba, tôi không biết cách xử lý thích hợp với các tệp khóa PID sau khi chúng được tạo, để khi quá trình PID không còn tồn tại, nó sẽ xóa tệp khóa PID sau đó. Thật khó để tìm tài liệu phù hợp về cách sử dụng các tệp PID trong tập lệnh bash để chỉ có thể có 1 phiên bản đang chạy.
Đây là quy tắc udev của tôi cho 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"
Tôi khá chắc chắn rằng đó là quy tắc udev sẽ như thế nào, các quyền dường như là chính xác đối với tôi vì nó đọc-ghi cho người dùng GROUP. Dường như có một số trường hợp xảy ra khi kịch bản bash của tôi chạy và quy tắc này được đặt tự động khi thiết bị điều khiển được kết nối, một số trò chơi trở nên không phản hồi như không có thiết bị điều khiển nào được kết nối khi có, giả sử để hành động /dev/js0
nhưng thay vào đó hành động /dev/js1
thay thế. Nó thường có thể trả về lỗi này cụ thể nếu nó không được thực thi như root;
OSError: [Errno 13] Permission denied: '/dev/input/event17'
và kịch bản bash tất nhiên; 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
là một lỗ hổng bảo mật cục bộ (xóa tệp tùy ý đối với tập lệnh đang chạy của người dùng), tốt hơn để sử dụng /var/run
hoặc như vậy. Các tập tin PID khác sẽ chỉ là một giải pháp tương tự với các trường hợp cạnh và gotchas, tùy thuộc vào cách mọi thứ sụp đổ.