这是我的/lib/udev/rules.d目录中的规则:
SUBSYSTEM=="input", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="008c", RUN+="/home/mikeknoop/scripts/udev-receiver.sh"
以下是udev-receiver.sh脚本的简单内容:
#!/bin/bash
echo "UDEV-RECEIVER INIT" >> /var/log/external.log
{
sleep 5;
echo "Done" >> /var/log/external.log
} &
echo "UDEV-RECEIVER FINISH" >> /var/log/external.log
Run Code Online (Sandbox Code Playgroud)
当我插入我的设备时,输出external.log如您所料:
UDEV-RECEIVER INIT
UDEV-RECEIVER FINISH
Done
Run Code Online (Sandbox Code Playgroud)
但是,我也在跟踪系统日志/var/log/syslog,可以看到即使我已经分叉了长时间运行的sleep进程,udev设备初始化仍然阻塞,直到Done出现在我的external.log文件中。
究其原因,这是重要的,因为我想通过设置一些设备属性xinput,但该设备未通过上市xinput list,直到整个udev初始化完成(以后才Done显示出来的external.log)。
“将程序添加到要为特定设备执行的程序列表中。这只能用于非常短的运行任务。长时间运行事件进程可能会阻止此设备或从属设备的所有进一步事件。长时间运行的任务需要立即与事件进程本身分离。”
我无法协调手册页和我看到的行为。任何人都可以通过xinput插入设备来阐明或提供更好的方法来设置属性吗?
谢谢!