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


8

ラップトップでUbuntu 9.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®Ergonomic Keyboard 4000 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 HID v1.11 Keyboard [MicrosoftNatural®Ergonomic Keyboard 4000] on usb-0000:00:1a.0-2 / input0
[20907.217810]入力:MicrosoftNatural®Ergonomic Keyboard 4000 as /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 HID v1.11 Device [MicrosoftNatural®Ergonomic Keyboard 4000] 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 == "入力"
    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"

  親デバイスを見る '/devices/pci0000:00/0000:00:1a.0/usb3/3-2':
    KERNELS == "3-2"
    SUBSYSTEMS == "usb"
    DRIVERS == "usb"
    ATTRS {構成} == ""
    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 {バージョン} == "2.00"
    ATTRS {maxchild} == "0"
    ATTRS {癖} == "0x0"
    ATTRS {authorized} == "1"
    ATTRS {メーカー} == "Microsoft"

  親デバイス '/devices/pci0000:00/0000:00:1a.0/usb3'を確認します。
    KERNELS == "usb3"
    SUBSYSTEMS == "usb"
    DRIVERS == "usb"
    ATTRS {構成} == ""
    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 {バージョン} == "1.10"
    ATTRS {maxchild} == "2"
    ATTRS {癖} == "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 {ベンダー} == "0x8086"
    ATTRS {デバイス} == "0x2937"
    ATTRS {subsystem_vendor} == "0x1558"
    ATTRS {subsystem_device} == "0x0860"
    ATTRS {クラス} == "0x0c0300"
    ATTRS {irq} == "16"
    ATTRS {local_cpus} == "ff"
    ATTRS {local_cpulist} == "0-7"
    ATTRS {modalias} == "pci:v00008086d00002937sv00001558sd00000860bc0Csc03i00"
    ATTRS {broken_parity_status} == "0"
    ATTRS {msi_bus} == ""

  親デバイス '/ devices / pci0000:00'を確認しています:
    KERNELS == "pci0000:00"
    サブシステム== ""
    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:呼び出し:テスト
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:00: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®Ergonomic Keyboard 4000"
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
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、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: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:実行: 'socket:@ / org / freedesktop / hal / udev_event'
udevadm_test:実行: '/ 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:呼び出し:テスト
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-keyboard.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®Ergonomic Keyboard 4000"
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
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、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:ACTION = remove
udevadm_test:SUBSYSTEM = input
udevadm_test:実行: 'socket:@ / org / freedesktop / hal / udev_event'
udevadm_test:実行: '/ usr / bin / numlockx off'

問題は、キーボードが接続されている、または接続されていない場合、NumLockステータスが変化しないことです。運が悪いので、udevサービスを再起動してみました。私のudevルールは間違っていますか?私はこれを間違った方法で行っていますか?


修繕!私を正しい方向に向けてくれたtony-p-leeとwhitequarkに感謝します。
Eric Heikes、2010年

回答:


5

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

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

プレーンコンソールでこれを試してください:と入力するとnumlockx on、「Error opening display!」と表示されます。と入力するとDISPLAY=:0 numlockx on、機能します(少なくとも私にとっては機能します)。

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


あなたが正しい!私はnumlockxがX環境を必要とするとは考えていませんでした。残念ながら、DISPLAYを設定するとエラーメッセージは表示されなくなりますが、コンソールでもudevでも機能しません。
Eric Heikes、2010年

スポークが早すぎます。あなたは完全なパスを使用してシェルを実行した場合、それは動作します:/bin/sh -c '...'
エリックHeikes

4

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

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

argsはバージョンによって異なる場合があることに注意してください...


3
素晴らしいヒント-私のudevdには「冗長」オプションはありません。udevd --debug私が問題を追跡するために必要なすべてでした。
Eric Heikes、2010年

@EricHeikes:ついに、udevシェルスクリプトが機能しないいくつかの有用な出力を得ることができました。ありがとうございました!
Mikko Ohtamaa

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.