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


8

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

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

Чтобы подключиться к системе устройств, я решил использовать udev. Я прочитал «Написание правил 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

  глядя на устройство '/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 {уник} == ""
    ATTR {modalias} == "входные: 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, а20, m4 , lsfw»

  глядя на родительское устройство '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1':
    KERNELS == "3-2: 1,1"
    Подсистемы == "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 {supports_autosuspend} == "1"

  глядя на родительское устройство '/devices/pci0000:00/0000:00:1a.0/usb3/3-2':
    KERNELS == "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} == "00 дБ"
    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 {причуды} == "0x0"
    ATTRS {разрешено} == "1"
    ATTRS {производитель} == "Microsoft"

  глядя на родительское устройство '/devices/pci0000:00/0000:00:1a.0/usb3':
    KERNELS == "usb3"
    Подсистемы == "USB"
    Драйверы == "USB"
    ATTRS {конфигурации} == ""
    ATTRS {bNumInterfaces} == "1"
    ATTRS {bConfigurationValue} == "1"
    AttrS {bmAttributes} == "e0"
    ATTRS {bMaxPower} == "0 мА"
    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 {причуды} == "0x0"
    ATTRS {разрешено} == "1"
    ATTRS {производитель} == "Linux 2.6.31-16-generic uhci_hcd"
    ATTRS {product} == "UHCI Host Controller"
    ATTRS {серийный} == "0000: 00: 1a.0"
    ATTRS {authorized_default} == "1"

  глядя на родительское устройство '/devices/pci0000:00/0000:00:1a.0':
    KERNELS == "0000: 00: 1a.0"
    Подсистемы == "PCI"
    ВОДИТЕЛИ == "uhci_hcd"
    ATTRS {поставщик} == "0x8086"
    ATTRS {устройство} == "0x2937"
    ATTRS {subsystem_vendor} == "0x1558"
    ATTRS {subsystem_device} == "0x0860"
    ATTRS {класс} == "0x0c0300"
    ATTRS {IRQ} == "16"
    AttrS {local_cpus} == "и далее"
    ATTRS {local_cpulist} == "0-7"
    ATTRS {modalias} == ": v00008086d00002937sv00001558sd00000860bc0Csc03i00 PCI"
    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: вызов: тест
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 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: 'socket: @ / org / freedesktop / hal / udev_event'
udevadm_test: run: '/ usr / bin / numlockx off'

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


Исправлена! Спасибо Тони-П-Ли и Уайткварку за то, что они указали мне правильное направление.
Эрик Хайкс

Ответы:


5

Проблема в том, что вы, вероятно, протестировали numlockx в (как следует из названия) в некоторой среде X. X-клиенты (программы с графическим интерфейсом, которые подключаются к X-серверу, например, Firefox или GEdit) должны знать сервер для подключения и также должны проходить определенную авторизацию. Попробуйте войти в систему с простой консоли, независимо от того, являетесь ли вы пользователем root или обычным пользователем, и запустите какое-либо приложение с графическим интерфейсом: оно покажет некоторые ошибки, связанные с DISPLAY, поскольку не знает об этом.

Чтобы это исправить, вам нужно установить переменную окружения DISPLAY; если у вас есть только один X-сервер, он почти всегда имеет адрес: 0.

Попробуйте это в простой консоли: введите numlockx on, и он покажет «Ошибка открытия дисплея!». Типа DISPLAY=:0 numlockx on, и оно будет работать (у меня работало как минимум).

Таким образом, вы можете установить эту переменную окружения в udev или просто запустить sh -c 'DISPLAY=:0 numlockx <state>'.


Вы правы! Я не думал, что numlockx требует X-среды. К сожалению, хотя установка DISPLAY избавляет от сообщения об ошибке, оно не работает - ни в консоли, ни через udev.
Эрик Хайкс

Говорил слишком рано. Это работает, если вы запускаете оболочку, используя полный путь:/bin/sh -c '...'
Eric Heikes

4

эти две команды могут быть использованы для отладки проблем udev:

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

Обратите внимание, что аргументы могут меняться в разных версиях ...


3
Отличный совет - хотя на моем udevd нет «многословной» опции. udevd --debugбыло все, что мне нужно, чтобы отследить проблему.
Эрик Хайкс

@EricHeikes: Наконец-то удалось получить полезный вывод, почему скрипты оболочки udev не работают. Спасибо!
Микко Охтамаа

0

Это может быть чистым совпадением, но мое правило udev начало работать, когда я назвал его, начиная с цифры, например. 80-usb-keyboard.rules,


Я тоже это обдумал, но это ничего не меняет.
Эрик Хайкс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.