为什么这条 udev 规则会被阻止?

Mik*_*oop 6 udev xinput 13.04

这是我的/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)。

根据udev(7) - Linux 手册页

“将程序添加到要为特定设备执行的程序列表中。这只能用于非常短的运行任务。长时间运行事件进程可能会阻止此设备或从属设备的所有进一步事件。长时间运行的任务需要立即与事件进程本身分离。”

我无法协调手册页和我看到的行为。任何人都可以通过xinput插入设备来阐明或提供更好的方法来设置属性吗?

谢谢!

Mik*_*oop 3

经过大量进一步研究后回答我自己的问题。

\n\n

新的 udev“哲学”

\n\n

显然,新的“正确”使用方法udev是不要引发长时间运行的进程。

\n\n

通过http://blog.fraggod.net/2012/06/16/proper-ish-way-to-start-long-running-systemd-service-on-udev-event-device-hotplug.html

\n\n
\n

RUN ...启动守护进程或其他长时间运行的进程不适合 udev;分叉进程,无论是否分离,都将在事件处理完成后被无条件终止。

\n
\n\n

请注意这与 OP 中的手册页引用是如何矛盾的。

\n\n

我最好的猜测是最近的一项udev更改(大约在 2012 年)迫使所有进程(包括其分叉子进程)在允许执行继续作为这一新理念的执行机制之前完成。

\n\n

因此,网络上所有提供 OP 模式作为解决方案的易于访问的文档和答案现在都已被破坏。

\n\n

当您谈论设备插入时始终运行的某个守护进程时,新的长期运行模式哲学是可以理解的。但是,它会随之消除有效的用例defer

\n\n

解决方法

\n\n

尽管如此,我还发现了一个解决方法:

\n\n

/lib/udev/rules.d/98-mouse-config.rules/

\n\n
SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="008c", ACTION=="add|remove", ENV{ID_TYPE}!="hid", RUN+="/home/mikeknoop/scripts/udev-receiver.sh"\n
Run Code Online (Sandbox Code Playgroud)\n\n

udev-receiver.sh

\n\n
#!/bin/bash\necho /home/mikeknoop/scripts/mouse.sh | at now\n
Run Code Online (Sandbox Code Playgroud)\n\n

mouse.sh

\n\n
#!/bin/bash\nsleep 3;\nexport DISPLAY=":0.0"\nexport XAUTHORITY="/home/mikeknoop/.Xauthority"\n/usr/bin/xinput --set-prop \'pointer:Microsoft Microsoft Wireless Optical Mouse\xc2\xae 1.0A\' \'Device Accel Constant Deceleration\' 2.00000\n... more xinput rules here\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意这已经过测试并且可以在 Ubuntu 13.04 上运行

\n\n

注意您需要at通过以下方式安装异步任务包sudo apt-get install at

\n\n

我从https://unix.stackexchange.com/questions/28548/how-to-run-custom-scripts-upon-usb-device-plug-in拼凑出解决方法

\n