新しい 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

ただし、syslog も追跡しており/var/log/syslog、長時間実行sleepプロセスをフォークしたにもかかわらず、ファイルに after が表示されるudevまでデバイスの初期化がブロックされていることがわかります。Doneexternal.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 のパターンを解決策として提供する、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

関連情報