我需要改进我的Bash脚本,以使其完美运行而不会出现问题。该脚本ds4drv
在其中使用,并且我不确定如何更正某些问题。
第一个问题是,在检测到控制器时它并不总是运行或正常工作,我已经为其创建了udev规则,但尚不清楚为什么在检测到该控制器时并不总是运行该脚本。
第二个问题,ds4drv
只能被允许以root用户身份运行,而不能以普通用户身份运行。
第三个问题,创建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
。特别是如果它不是以root身份执行的,通常会返回此错误。
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
您可以发布udev规则吗?
—
乔
的使用
—
thrig
/tmp
是一种本地安全漏洞(针对用户正在运行的脚本,任意删除文件),/var/run
或者更好地使用。否则,PID文件只能解决边缘情况和陷阱,具体取决于情况如何。