
/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
ただし、syslog も追跡しており/var/log/syslog
、長時間実行sleep
プロセスをフォークしたにもかかわらず、ファイルに after が表示されるudev
までデバイスの初期化がブロックされていることがわかります。Done
external.log
これが重要な理由は、 を介していくつかのデバイス プロパティを設定しようとしているのですが、初期化全体が完了するまで(に が表示されるまで)、xinput
デバイスは を介してリストされないからです。xinput list
udev
Done
external.log
「特定のデバイスで実行されるプログラムのリストにプログラムを追加します。これは、実行時間が短いタスクにのみ使用できます。イベント プロセスを長時間実行すると、このデバイスまたは依存デバイスの以降のすべてのイベントがブロックされる可能性があります。長時間実行されるタスクは、イベント プロセス自体からすぐに切り離す必要があります。」
マニュアル ページと私が見ている動作を一致させることができません。xinput
デバイスが挿入されたときにプロパティを設定するためのよりよい方法やヒントを誰か教えていただけませんか?
ありがとう!
答え1
さらに多くの調査を行った後、自分自身の質問に答えます。
新しい udev の「哲学」
どうやら、新しい「適切な」使用方法は、udev
長時間実行されるプロセスを発生させないことのようです。
RUN ... デーモンやその他の長時間実行されるプロセスを起動することは udev には適していません。フォークされたプロセスは、デタッチされているかどうかに関係なく、イベント処理が終了した後に無条件に強制終了されます。
これは OP のマニュアルページの引用と矛盾していることに注意してください。
私の推測では、最近のudev
変更(2012年頃)により、すべてのプロセスが強制的に含むこの新しい哲学の強制メカニズムとして、実行を続行する前に、分岐した子プロセスを完了する必要があります。
したがって、OP のパターンを解決策として提供する、Web 上で簡単にアクセスできるすべてのドキュメントと回答は現在壊れています。
新しい長期実行パターンの哲学は、デバイスが接続されているときに常に実行されているデーモンについて話している場合、理解できます。ただし、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