Bash 스크립트가 문제 없이 완벽하게 실행되도록 개선해야 합니다. 이 스크립트는 ds4drv
여기에 사용되며 수정 방법을 잘 모르는 몇 가지 문제가 있습니다.
첫 번째 문제는 컨트롤러가 감지될 때 항상 실행되거나 작동하지 않는다는 것입니다. 이에 대한 udev 규칙을 만들었지만 컨트롤러를 감지할 때 항상 스크립트를 실행하지 않는 이유는 명확하지 않습니다.
두 번째 문제 ds4drv
는 일반 사용자가 아닌 루트로만 실행할 수 있다는 점이다.
세 번째 질문은 PID 잠금 파일을 생성한 후 이를 처리하는 올바른 방법을 모르기 때문에 PID 프로세스가 더 이상 존재하지 않으면 PID 잠금 파일을 삭제한다는 것입니다. Bash 스크립트에서 PID 파일을 사용하는 방법에 대한 적절한 문서를 찾기가 어렵기 때문에 실행 중인 인스턴스는 1개만 있을 수 있습니다.
내 ds4drv udev 규칙은 다음과 같습니다.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"
나는 udev 규칙이 이와 같아야 한다고 확신하며 GROUP 사용자에 대해 읽고 쓰기 때문에 권한이 올바른 것 같습니다. 몇 가지 문제가 있는 것 같습니다. 일단 내 bash 스크립트가 실행되고 컨트롤러 장치가 연결될 때 이 규칙이 자동으로 실행되도록 설정되면 일부 게임은 연결된 컨트롤러 장치가 없는 것처럼 응답하지 않게 됩니다(취한 조치가 있다고 가정) /dev/js0
. 대신 조치를 취하십시오 /dev/js1
. 특히 루트로 실행되지 않은 경우 이 오류가 반환되는 경우가 많습니다.
OSError: [Errno 13] Permission denied: '/dev/input/event17'
물론 bash 스크립트도 있습니다.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
답변1
2점 고민되네요
- PID 파일에 익숙하지 않지만
pgrep
해결 방법으로 사용하는 것이 좋습니다. ds4drv
데몬인 것 같지만udev
단기 실행 프로세스만 지원합니다.실행{유형}
...
이는 매우 단기적으로 실행되는 포그라운드 작업에만 사용할 수 있습니다. 장기 실행 이벤트 프로세스는 해당 장치 또는 슬레이브 장치에 대한 모든 추가 이벤트를 차단할 수 있습니다.
데몬이나 기타 장기 실행 프로세스를 시작하는 것은 udev에 적합하지 않습니다. 분리 여부에 관계없이 분기된 프로세스는 이벤트 처리가 완료된 후 무조건 종료됩니다.
다음 스크립트를 복사하세요.
#!/bin/bash
# DS4 Check Script
pgrep ds4drv || ds4drv --hidraw --config /home/user/.config/ds4drv.conf & disown