Скрипт в правиле udev не запускается

Я использую Ubuntu 9.10 (Karmic Koala) на ноутбуке и хотел бы, чтобы NumLock автоматически переключался в зависимости от того, подключена ли моя клавиатура USB (включен ли numlock) или нет (выключен numlock).

Для этого я сначала установил пакет "numlockx". numlockx on а также numlockx off работает отлично.

Чтобы подключиться к системе устройства, я решил использовать udev. Я посмотрел другие вопросы о Stackru и прочитал "Написание правил udev". Но у меня проблемы с тем, чтобы заставить работать правило udev.

Во-первых, вот пример dmesg выход:

[20906.985102] usb 3-2: новое низкоскоростное USB-устройство с использованием uhci_hcd и адреса 6
[20907.166403] USB 3-2: конфигурация № 1 выбрана из 1 выбора
[20907.192904] ввод: Microsoft Natural® Ergonomic Keyboard 4000 в виде /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.0/input/input20
[20907.193100] microsoft 0003:045E:00DB.000B: ввод,hidraw1: USB HID v1.11 Клавиатура [Эргономичная клавиатура Microsoft Natural® 4000] на usb-0000:00:1a.0-2/input0
[20907.217810] ввод: Эргономичная клавиатура Microsoft Natural® 4000, как /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21
[20907.217979] microsoft 0003:045E:00DB.000C: ввод,hidraw2: USB HID v1.11 Устройство [Эргономическая клавиатура Microsoft Natural® 4000] на 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 просматривая данные устройства / устройства /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,7В, 7С,7D,7E,7F,80,81,82,83,84,85,86,87,88,89,8A,8В, 8С, 8Е,90,96,98,9B,9С, 9Е,9F, А1, А3, А4, А5, А6, А7, А8, А9,AB,AC,AD,AE, В0, В1, В2, В3, В4, В5, В6, В8, В9, ВА, ВВ, ВС,BD,BE,BF, С0, С1, С2,CE,CF,D0,D1,D2,D5,D9,DB,DF, Е2, Е7, Е8, Е9, Е. А., Е. Б.,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" ДРАЙВЕРЫ =="usbhid"
    ATTRS{bInterfaceNumber}=="01"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bNumEndpoints}=="01"
    ATTRS{bInterfaceClass}=="03"
    ATTRS{bInterfaceSubClass}=="00"
    ATTRS{bInterfaceProtocol}=="00"
    ATTRS{modalias}=="usb:v045Ep00DBd0173dc00dsc00dp00ic03isc00ip00"
    ATTRS{support_autosuspend}=="1", смотря на родительское устройство '/devices: pci: pc / pci: устройств / pci 00:1a.0/usb3/3-2': ЯДРА =="3-2" СУБСИСТЕМЫ == "ДРАЙВЕРЫ usb" =="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{скорость}=="1.5"
    ATTRS{busnum}=="3"
    ATTRS{devnum}=="6"
    ATTRS{версия}==" 2.00"
    ATTRS{maxchild}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{авторизованный} == "1" ATTRS {производитель}=="Microsoft" смотрит на родительское устройство '/devices/pci0000:00/0000:00:1a.0/usb3':
    KERNELS=="usb3"
    SUBSYSTEMS=="usb" ДРАЙВЕРЫ =="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{скорость}=="12"
    ATTRS{busnum}=="3"
    ATTRS{devnum}=="1"
    ATTRS{версия}==" 1.10"
    ATTRS{maxchild}=="2"
    ATTRS{quirks}=="0x0"
    ATTRS{авторизованный} == "1" ATTRS {производитель}=="Linux 2.6.31-16-generic uhci_hcd"
    ATTRS{product}=="UHCI Host Controller"
    ATTRS{serial}=="0000:00:1a.0"
    ATTRS{authorized_default}=="1", глядя на родительское устройство '/devices/pci0000:00/0000:00:1a.0':
    KERNELS=="0000:00:1a.0"
    SUBSYSTEMS=="pci"ДРАЙВЕРЫ =="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:v00008086d00002937sv00001558sd00000860bc0Csc03i00"
    ATTRS{broken_parity_status}=="0"
    ATTRS{msi_bus}==""глядя на родительское устройство '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS=" "

Поэтому я создал файл с именем /etc/udev/rules.d/usb-keyboard.rules:

# Включите NumLock, когда клавиатура подключена.
ДЕЙСТВИЕ == "добавить", ATTRS{производитель}=="Microsoft", SUBSYSTEM=="ввод", RUN+="/usr/bin/numlockx вкл"

# Выключайте NumLock, когда клавиатура отключена.
ДЕЙСТВИЕ == "удалить", ATTRS{производитель}=="Microsoft", SUBSYSTEM=="ввод", 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 'сокет:@/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 на' /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="Эргономичная клавиатура Microsoft Natural® 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= вход: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,8В, 8С, 8Е, 90,96,98,9B, 9С, 9Е,9F, А1, А3, А4, А5, А6, А7, А8, А9,AB,AC,AD,AE, В0, В1, В2, В3, В4, В5, В6, В8, В9, ВА, ВВ, ВС,BD,BE,BF, С0, С1, С2,CE,CF,D0,D1,D2,D5,D9,DB,DF, Е2, Е7, Е8, Е9, Е. А., Е.Б., F0,100,162,166,16A, 16E, 178,179,17A, 17B, 17C, 17D, 17F, 180181182185, 18C, 18D, 192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1AD, 1AE, 1B0,1B1,1B7, r6, а20,m4,lsfw
udevadm_test: ACTION= добавить
udevadm_test: SUBSYSTEM= вход
udevadm_test: run: '/sbin/modprobe -b вход: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,9С, 9Е,9F,A1,A3,A4, А5, А6, А7, А8, А9,AB,AC,AD,AE, В0, В1, В2, В3, В4, В5, В6, В8, В9, ВА, ВВ, ВС,BD,BE,BF, С0, С1, С2,CE,CF,D0,D1,D2,D5,D9,DB,DF, Е2, Е7, Е8, Е9, Е. А., Е.Б., 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, а20, 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 'сокет: @ / 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="Эргономическая клавиатура Microsoft Natural® 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 fffffffffff = uffffff = fffffd_ffff = f_ffff = f_tff_tff_tff_tff: 0: 0 udevadm_test: MSC == 10 udevadm_test: MODALIAS = вход: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,9С, 9Е,9F,A1,A3,A4,A5,A6,A7,A8,A9,AB,AC,AD,AE, В0, В1, В2, В3, В4, В5, В6, В8, В9, ВА, ВВ, ВС,BD,BE,BF, С0, С1, С2,CE,CF,D0,D1,D2,D5,D9,DB,DF, Е2, Е7, Е8, Е9, Е. А., Е.Б.,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= удалить udevadm_test: SUBSYSTEM= ввод udevadm_test: выполнить: 'socket:@/org/freedesktop/hal/udev_event'
udevadm_test: run: '/usr/bin/numlockx off'

Проблема в том, что когда клавиатура подключена или отключена, состояние NumLock не меняется. Я попытался перезапустить службу udev, но безуспешно. Мои правила udev неправильны? Я поступаю об этом неправильно?

1 ответ

  1. Я не очень осведомлен об этом, но я думаю, что состоянием клавиатуры управляет "водопровод" X11, который находится на более высоком уровне, чем udev, поэтому все, что вы там делаете, переопределяется. Вы можете узнать больше, копаясь в файлах конфигурации в /etc/X11,

  2. Вы можете получить более релевантные ответы на этот вопрос на superuser.com (ссылка в самом низу этой страницы). Я не буду голосовать, чтобы закрыть ваш вопрос здесь, но другие могут.

Другие вопросы по тегам