新的 udev“哲學”

新的 udev“哲學”

這是我的/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

當我插入設備時,輸出external.log如您所料:

UDEV-RECEIVER INIT
UDEV-RECEIVER FINISH
Done

但是,我還追蹤系統日誌/var/log/syslog,並且可以看到,即使我已經分叉了長時間運行的sleep進程,udev設備初始化也會被阻止,直到Done出現在我的external.log檔案中。

這很重要的原因是因為我試圖透過設定一些裝置屬性,但在整個初始化完成之前(直到中顯示之後) xinput,裝置才會列出。xinput listudevDoneexternal.log

根據udev(7) - Linux 手冊頁

「將程式新增至要為特定裝置執行的程式清單。這只能用於非常短的運行任務。長時間運行事件進程可能會阻止該裝置或從屬裝置的所有進一步事件。長時間運行的任務需要立即與事件流程本身分離。

我無法協調手冊頁和我所看到的行為。任何人都可以闡明或提供更好的方法來透過xinput插入設備時設定屬性嗎?

謝謝!

答案1

經過大量進一步研究後回答自己的問題。

新的 udev“哲學”

顯然,新的「正確」使用方法udev是不要引發長時間運行的進程。

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

RUN ...啟動守護程序或其他長時間運行的程序不適合 udev;分叉的進程,無論是否分離,都將在事件處理完成後無條件終止。

請注意這與 OP 中的手冊頁引用是如何矛盾的。

我最好的猜測是最近的一個udev變化(~2012 年的某個時候)強制所有流程包括他們的分叉子進程在允許繼續執行之前完成,作為這一新理念的執行機制。

因此,網路上提供 OP 模式作為解決方案的所有易於存取的文檔和答案現在都已被破壞。

當您談論設備插入時始終運行的某個守護程序時,新的長期運行模式哲學是可以理解的defer

解決方法

儘管如此,我還是發現了一個解決方法:

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

SUBSYSTEM=="usb", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="008c", ACTION=="add|remove", ENV{ID_TYPE}!="hid", RUN+="/home/mikeknoop/scripts/udev-receiver.sh"

udev-receiver.sh

#!/bin/bash
echo /home/mikeknoop/scripts/mouse.sh | at now

mouse.sh

#!/bin/bash
sleep 3;
export DISPLAY=":0.0"
export XAUTHORITY="/home/mikeknoop/.Xauthority"
/usr/bin/xinput --set-prop 'pointer:Microsoft Microsoft Wireless Optical Mouse® 1.0A' 'Device Accel Constant Deceleration' 2.00000
... more xinput rules here

筆記這已經過測試並且可以在 Ubuntu 13.04 上運行

筆記您需要at透過安裝非同步任務包sudo apt-get install at

我拼湊了解決方法https://unix.stackexchange.com/questions/28548/how-to-run-custom-scripts-upon-usb-device-plug-in

相關內容