web-dev-qa-db-ja.com

udevルールのスクリプトが実行されない

ラップトップでUbuntu9.10(Karmic Koala)を実行していますが、USBキーボードが接続されているか(numlockがオン)、接続されていないか(numlockがオフ)に応じてNumLockを自動的に切り替えたいと考えています。

これを実現するために、私は最初に「numlockx」パッケージをインストールしました。 numlockx onおよびnumlockx offは正常に機能します。

デバイスシステムに接続するには、udevを使用すると思いました。 "udevルールの記述" を読みましたが、udevルールを機能させるのに問題があります。

まず、dmesg出力の例を次に示します。

 [20906.985102] usb 3-2:uhci_hcdとアドレス6を使用する新しい低速USBデバイス
 [20907.166403] usb 3-2:1つの選択肢から選択された構成#1 
 [20907.192904 ]入力:MicrosoftNatural®ErgonomicKeyboard4000 as /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.0/input/input20 
 [20907.193100] Microsoft 0003 :045E:00DB.000B:input、hidraw1:USB HIDv1.11キーボード[MicrosoftNatural®ErgonomicKeyboard4000] on usb-0000:00:1a.0-2/input0 
 [20907.217810]入力:Microsoft Natural®ErgonomicKeyboard4000as/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 
 [20907.217979] Microsoft 0003:045E:00DB .000C:input、hidraw2:USB HIDv1.11デバイス[MicrosoftNatural®ErgonomicKeyboard4000] on usb-0000:00:1a.0-2/input1 

udevadm infoを使用してデバイス情報を収集しました。

> udevadm info -a -p /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 
 
デバイス '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21':
 KERNEL == "input21" 
 SUBSYSTEM == "input" 
 DRIVER == "" 
 ATTR {phys} == "usb-0000:00:1a.0-2/input1" 
 ATTR {uniq} == "" 
 ATTR {modalias} == "input:b0003v045Ep00DBe0111-e0,1,2,3,4,14、k71,72,73,74,75,77,79 、7A、7B、7C、7D、7E、7F、80、81、82、83、84、85、86、87、88、89、8A、8B、8C、8E、90、96、98、9B、9C 、9E、9F、A1、A3、A4、A5、A6、A7、A8、A9、AB、AC、AD、AE、B0、B1、B2、B3、B4、B5、B6、B8、B9、BA、BB 、BC、BD、BE、BF、C0、C1、C2、CE、CF、D0、D1、D2、D5、D9、DB、DF、E2、E7、E8、E9、EA、EB、F0、100、162、166、16A 、16E、178,179,17A、17B、17C、17D、17F、180,181,182,185,18C、18D、192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA、1AB、1AC、1AD 、1AE、1B0,1B1,1B7、r6、a20、m4、lsfw "
 
親デバイスを見る '/devices/pci0000:00/0000:00:1a.0/usb3/3 -2/3-2:1.1 ':
 KERNELS == "3-2:1.1" 
 SUBSYSTEMS == "usb" 
 DRIVERS == "usbhid" 
 ATTRS {bInterfaceNumber} == "01" 
 ATTRS {bAlternateSetting} == "0" 
 ATTRS {bNumEndpoints} == "01" 
 ATTRS {bInterfaceClass} == "03" 
 ATTRS {bInterfaceSubClass} == "00" 
 ATTRS {bInterfaceProtocol} == "00" 
 ATTRS {modalias} = = "usb:v045Ep00DBd0173dc00dsc00dp00ic03isc00ip00" 
 ATTRS {supports_autosuspend} == "1" 
 
親デバイスを確認中usb3/3-2 ':
 KERNELS == "3-2" 
 SUBSYSTEMS == "usb" 
 DRIVERS == "usb" 
 ATTRS {configuration } == "" 
 ATTRS {bNumInterfaces} == "2" 
 ATTRS {bConfigurationValue} == "1" 
 ATTRS {bmAttributes} == "a0" 
 ATTRS {bMaxPower} == "100mA" 
 ATTRS {urbnum} == "532" 
 ATTRS {idVendor} == "045e" 
 ATTRS {idProduct} == "00db" 
 ATTRS {bcdDevice} == "0173" 
 ATTRS {bDeviceClass} == "00" 
 ATTRS {bDeviceSubClass} == "00" 
 ATTRS {bDeviceProtocol} == "00" 
 ATTRS {bNumConfigurations} == "1" 
 ATTRS {bMaxPacketSize0} == "8" 
 ATTRS {speed} == "1.5" 
 ATTRS {busnum } == "3" 
 ATTRS {devnum} == "6" 
 ATTRS {version} == "2.00" 
 ATTRS {maxchild} == "0" 
 ATTRS {quirks} == "0x0" 
 ATTRS {authorized} == "1" 
 ATTRS {manufacturer} == "Microsoft" 
 
親デバイスを見る '/devices/pci0000:00/0000:00:1a.0 /usb3':
 KERNELS == "usb3" 
 SUBSYSTEMS == "usb" 
 DRIVERS == "usb" 
 ATTRS {configuration} == "" 
 ATTRS {bNumInterfaces} == "1" 
 ATTRS {bConfigurationValue} == "1" 
 ATTRS {bmAttributes} == "e0" 
 ATTRS {bMaxPower} == "0mA" 
 ATTRS {urbnum} == "127" 
 ATTRS {idVendor} == "1d6b" 
 ATTRS {idProduct} == "0001" 
 ATTRS {bcdDevice} == "0206" 
 ATTRS {bDeviceClass} == "09" 
 ATTRS {bDeviceSubClass} == "00" 
 ATTRS {bDeviceProtocol} == "00" 
 ATTRS {bNumConfigurations} = = "1" 
 ATTRS {bMaxPacketSize0} == "64" 
 ATTRS {speed} == "12" 
 ATTRS {busnum} == "3" 
 ATTRS {devnum} == "1" 
 ATTRS {version} == "1.10" 
 ATTRS {maxchild} == "2" 
 ATTRS {quirks} == " 0x0 "
 ATTRS {authorized} ==" 1 "
 ATTRS {manufacturer} ==" Linux 2.6.31-16-generic uhci_hcd "
 ATTRS {product} ==" UHCIホストコントローラー "
 ATTRS {serial} ==" 0000:00:1a.0 "
 ATTRS {authorized_default} ==" 1 "
 
親デバイス '/devices/pci0000:00/0000:00:1a.0':
 KERNELS == "0000:00:1a.0" 
 SUBSYSTEMS == "pci" 
 DRIVERS == "uhci_hcd" 
 ATTRS {vendor} == "0x8086" 
 ATTRS {device} == "0x2937" 
 ATTRS {subsystem_vendor} == "0x1558" 
 ATTRS {subsystem_device} == "0x0860" 
 ATTRS {class} == "0x0c0300" 
 ATTRS {irq} == "16" 
 ATTRS {local_cpus } == "ff" 
 ATTRS {local_cpulist} == "0-7" 
 ATTRS {modalias} == "pci:v00008086d00002937sv00001558 sd00000860bc0Csc03i00 "
 ATTRS {broken_parity_status} ==" 0 "
 ATTRS {msi_bus} ==" "
 
親デバイスを見る '/ devices/pci0000:00 ':
 KERNELS == "pci0000:00" 
 SUBSYSTEMS == "" 
 DRIVERS == "" 

そこで、/etc/udev/rules.d/usb-keyboard.rulesというファイルを作成しました。

#キーボードが接続されているときにNumLockをオンにします。
 ACTION == "add"、ATTRS {manufacturer} == "Microsoft"、SUBSYSTEM == "input"、RUN + = "/ usr/bin/numlockx on "
 
#キーボードが接続されていないときにNumLockをオフにします。
 ACTION ==" remove "、ATTRS {manufacturer} ==" Microsoft "、SUBSYSTEM ==" input "、RUN + ="/usr/bin/numlockx off "

udevadm testを使用して、ルールが正しいことを確認しました。

> udevadm test --action = add /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 
 run_command:呼び出し:test 
 udevadm_test:バージョン147 
 
 [...] 
 parse_file:読み取り '/etc/udev/rules.d/usb-keyboard.rules 'ルールファイルとして
 udev_rules_new:ルールは180864バイトのトークン(15072 * 12バイト)、31614バイトのバッファーを使用
 udev_rules_new:一時インデックスは49760バイト(2488 * 20バイト)を使用
 udev_device_new_from_syspath :デバイス0x28d7d80にdevpathがあります '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21' 
 udev_rules_apply_to_event:RUN '/ sbin/modprobe -b $ env {MODALIAS} '/ lib/udev/rules.d/80-drivers.rules:5 
 udev_rules_apply_to_event:RUN' socket:@/org/freedesktop/hal/udev_event '/ lib/udev/rules.d/90-hal.rules:2 
 udev_device_new_from_syspath:デバイス0x28d8560にはdevpathがあります '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1' 
 udev_device_new_from_syspath:デバイス0x28d8708にdevpathがあります '/ devices/pci0000:00/0000:0 0:1a.0/usb3/3-2 '
 udev_rules_apply_to_event:RUN'/usr/bin/numlockx on '/ etc/udev/rules.d/usb-keyboard.rules:7 
 udevadm_test:UDEV_LOG = 6 
 udevadm_test:DEVPATH =/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 
 udevadm_test :PRODUCT = 3/45e/db/111 
 udevadm_test:NAME = "MicrosoftNatural®ErgonomicKeyboard4000" 
 udevadm_test:PHYS = "usb-0000:00:1a.0-2/input1 "
 udevadm_test:UNIQ =" "
 udevadm_test:EV == 10001f 
 udevadm_test:KEY == 837fff 2c3027 bf004444 0 0 1 10f84 8a27c007 ff7f7bfa d9415fff febeffff_ eff 。] udevadm_test:REL == 40 
 udevadm_test:ABS == 1 0 
 udevadm_test:MSC == 10 
 udevadm_test:MODALIAS = input:b0003v045Ep00DBe0111-e0,1,2、 3,4,14、k71,72,73,74,75,77,79,7A、7B、7C、7D、7E、7F、80,81,82,83,84,85,86,87,88、 89,8A、8B、8C、8E、90,96,98,9B、9C、9E、9F、A1、A3、A4、A5、A6、A7、A8、A9、AB、AC、AD、AE、B0、 B1、B2、B3、B4、B5、B6、B8、B9、BA、BB、BC、BD、BE、BF、C0、C1、C2、CE、CF、D0、D1、D2、D5、D9、DB、 DF、E2、E7、E8、E9、EA、EB、F0、100、16 2,166,16A、16E、178,179,17A、17B、17C、17D、17F、180,181,182,185,18C、18D、192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA、1AB、 1AC、1AD、1AE、1B0,1B1,1B7、r6、a20、m4、lsfw 
 udevadm_test:ACTION = add 
 udevadm_test:SUBSYSTEM = input 
 udevadm_test:run: '/ sbin/modprobe -b input:b0003v045Ep00DBe0111-e0,1,2,3,4,14、k71,72,73,74,75,77,79,7A、7B、7C、7D、7E、7F、80,81 、82,83,84,85,86,87,88,89,8A、8B、8C、8E、90,96,98,9B、9C、9E、9F、A1、A3、A4、A5、A6、A7 、A8、A9、AB、AC、AD、AE、B0、B1、B2、B3、B4、B5、B6、B8、B9、BA、BB、BC、BD、BE、BF、C0、C1、C2、CE 、CF、D0、D1、D2、D5、D9、DB、DF、E2、E7、E8、E9、EA、EB、F0,100,162,166,16A、16E、178,179,17A、17B、17C、17D、17F、180,181,182,185 、18C、18D、192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA、1AB、1AC、1AD、1AE、1B0,1B1,1B7、r6、a20、m4、lsfw '
 udevadm_test:run:' socket:@/org/freedesktop/hal/udev_event '
 udevadm_test:run:'/usr/bin/numlockx on '

そして、これが「削除」テストです。

> udevadm test --action = remove /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 
 
 run_command:呼び出し:test 
 udevadm_test:バージョン147 
 
 [...] 
 parse_file:読み取り '/etc/udev/rules.d/ usb-keyboard.rules 'をルールファイルとして
 udev_rules_new:ルールは180864バイトのトークン(15072 * 12バイト)、31614バイトのバッファーを使用
 udev_rules_new:一時インデックスは49760バイト(2488 * 20バイト)を使用
 udev_device_new_from_syspath:デバイス0xd2fd80にdevpathがあります '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21' 
 udev_rules_apply_to_event:RUN 'socket:@/org/freedesktop/hal/udev_event' /lib/udev/rules.d/90-hal.rules:2
udev_device_new_from_syspath:デバイス0xd2fff8にdevpathがあります '/ devices/pci0000:00/0000: 00:1a.0/usb3/3-2/3-2:1.1 '
 udev_device_new_from_syspath:デバイス0xd30690にはdevpathがあります'/devices/pci0000:00/0000:00:1a.0/usb3/3-2 '
 udev_rules_apply_to_event:RUN'/usr/bin/numlockx off '/ etc/udev/rules.d/usb-k eyboard.rules:10 
 udevadm_test:UDEV_LOG = 6 
 udevadm_test:DEVPATH =/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1 /input/input21
udevadm_test:PRODUCT = 3/45e/db/111 
 udevadm_test:NAME = "MicrosoftNatural®ErgonomicKeyboard4000" 
 udevadm_test:PHYS = "usb-0000 :00:1a.0-2/input1 "
 udevadm_test:UNIQ =" "
 udevadm_test:EV == 10001f 
 udevadm_test:KEY == 837fff 2c3027 bf004444 0 0 1 10f84 8a27c007 ff7f7bfa d9415fff febeffdf ffefffff ffffffff fffffffe 
 udevadm_test:REL == 40 
 udevadm_test:ABS == 1 0 
 udevadm_test:MSC == 10 [.__入力:b0003v045Ep00DBe0111-e0,1,2,3,4,14、k71,72,73,74,75,77,79,7A、7B、7C、7D、7E、7F、80,81,82,83、 84,85,86,87,88,89,8A、8B、8C、8E、90,96,98,9B、9C、9E、9F、A1、A3、A4、A5、A6、A7、A8、A9、 AB、AC、AD、AE、B0、B1、B2、B3、B4、B5、B6、B8、B9、BA、BB、BC、BD、BE、BF、C0、C1、C2、CE、CF、D0、 D1、D2、D5、D9、DB、DF、E2、E7、E8、E9、EA、EB、F0、100、162、166、16A、16E、178、179、17A、17B、17C、17D、17F、180、181、182、185、18C、18D、 192,193,195,1A0,1A1,1A2,1A3,1A4,1A 5,1A6,1A7,1A8,1A9,1AA、1AB、1AC、1AD、1AE、1B0,1B1,1B7、r6、a20、m4、lsfw 
 udevadm_test:ACTION = remove 
 udevadm_test: SUBSYSTEM = input 
 udevadm_test:run: 'socket:@/org/freedesktop/hal/udev_event' 
 udevadm_test:run: '/ usr/bin/numlockx off' 

問題は、キーボードが接続または接続解除されても、NumLockのステータスが変更されないことです。 udevサービスを再起動しようとしましたが、うまくいきませんでした。私のudevルールは間違っていますか?私はこれについて間違った方法で行っていますか?

8
Eric Heikes

問題は、おそらく(名前が示すように)いくつかのX環境でnumlockxをテストしたことです。 Xクライアント(FirefoxやGEditなどのXサーバーに接続するGUIプログラム)は、接続するサーバーを認識している必要があり、また、何らかの認証を渡す必要があります。ルートユーザーまたはプレーンユーザーに関係なく、プレーンコンソールからログインして、GUIアプリケーションを起動してみてください。わからないため、DISPLAY関連のエラーが表示されます。

これを修正するには、環境変数DISPLAYを設定する必要があります。 Xサーバーが1つしかない場合、ほとんどの場合、アドレスは0です。

プレーンコンソールでこれを試してください:numlockx onと入力すると、「ディスプレイを開くときにエラーが発生しました!」と表示されます。 DISPLAY=:0 numlockx onと入力すると、機能します(少なくとも私にとっては機能しました)。

したがって、この環境変数をudevで設定するか、sh -c 'DISPLAY=:0 numlockx <state>'を起動することができます。

5
whitequark

これらの2つのコマンドは、udevの問題を多くデバッグするために使用できます。

 udevd --debug-trace --verbose
 strace -p pid_of_udevd -f -e trace=open,exec

Argsはバージョンが異なると変更される可能性があることに注意してください...

4
tony-p-lee

まったくの偶然かもしれませんが、udevルールは、番号で始まる名前を付けたときに機能し始めました。 80-usb-keyboard.rules

0