
這是我的/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 list
udev
Done
external.log
「將程式新增至要為特定裝置執行的程式清單。這只能用於非常短的運行任務。長時間運行事件進程可能會阻止該裝置或從屬裝置的所有進一步事件。長時間運行的任務需要立即與事件流程本身分離。
我無法協調手冊頁和我所看到的行為。任何人都可以闡明或提供更好的方法來透過xinput
插入設備時設定屬性嗎?
謝謝!
答案1
經過大量進一步研究後回答自己的問題。
新的 udev“哲學”
顯然,新的「正確」使用方法udev
是不要引發長時間運行的進程。
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