Skrypt w regule udev nie działa


8

Używam Ubuntu 9.10 (Karmic Koala) na laptopie i chciałbym, aby NumLock automatycznie przełączał się w zależności od tego, czy moja klawiatura USB jest podłączona (numlock wł.), Czy odłączona (numlock wył.).

Aby to osiągnąć, najpierw zainstalowałem pakiet „numlockx”. numlockx oni numlockx offdziała dobrze.

Aby podłączyć się do systemu urządzeń, pomyślałem, że użyję udev. Przeczytałem „Pisanie reguł udev” , ale mam problem z uruchomieniem reguły udev.

Po pierwsze, oto przykład dmesgwyniku:

[20906.985102] USB 3-2: nowe urządzenie USB o niskiej prędkości wykorzystujące uhci_hcd i adres 6
[20907.166403] USB 3-2: konfiguracja nr 1 wybrana spośród 1 opcji
[20907.192904] dane wejściowe: Klawiatura Microsoft Natural® Ergonomic 4000 jako /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.0/input/input20
[20907.193100] microsoft 0003: 045E: 00DB.000B: wejście, hidraw1: klawiatura USB HID v1.11 [Microsoft Natural® Ergonomic Keyboard 4000] na USB-0000: 00: 1a.0-2 / input0
[20907.217810] wejście: Microsoft Natural® 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: wejście, hidraw2: urządzenie USB HID v1.11 [Microsoft Natural® Ergonomic Keyboard 4000] na USB-0000: 00: 1a.0-2 / input1

Kiedyś udevadm infozbierałem informacje o urządzeniu:

> udevadm info -a -p /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21

  patrząc na urządzenie „/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21”:
    KERNEL == „input21”
    PODSYSTEM == „wejście”
    STEROWNIK == ""
    ATTR {phys} == "usb-0000: 00: 1a.0-2 / input1"
    ATTR {uniq} == ""
    ATTR {modalias} == "wejście: 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 ”

  patrząc na urządzenie nadrzędne '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1':
    Jądra == "3-2: 1.1"
    PODSYSTEMY == „usb”
    KIEROWCY == „usbhid”
    ATTRS {bInterfaceNumber} == "01"
    ATTRS {bAlternateSetting} == „0”
    ATTRS {bNumEndpoints} == "01"
    ATTRS {bInterfaceClass} == "03"
    ATTRS {bInterfaceSubClass} == "00"
    ATTRS {bInterfaceProtocol} == "00"
    ATTRS {modalias} == "usb: v045Ep00DBd0173dc00dsc00dp00ic03isc00ip00"
    ATTRS {obsługuje_autosuspend} == „1”

  patrząc na urządzenie nadrzędne „/devices/pci0000:00/0000:00:1a.0/usb3/3-2”:
    Jądra == „3-2”
    PODSYSTEMY == „usb”
    STEROWNIKI == „usb”
    ATTRS {konfiguracja} == ""
    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 {prędkość} == "1,5"
    ATTRS {busnum} == "3"
    ATTRS {devnum} == "6"
    ATTRS {version} == "2.00"
    ATTRS {maxchild} == „0”
    ATTRS {dziwactwa} == "0x0"
    ATTRS {autoryzowany} == „1”
    ATTRS {producent} == „Microsoft”

  patrząc na urządzenie nadrzędne „/devices/pci0000:00/0000:00:1a.0/usb3”:
    KERNELS == "usb3"
    PODSYSTEMY == „usb”
    STEROWNIKI == „usb”
    ATTRS {konfiguracja} == ""
    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 {wersja} == "1.10"
    ATTRS {maxchild} == "2"
    ATTRS {dziwactwa} == "0x0"
    ATTRS {autoryzowany} == „1”
    ATTRS {producent} == "Linux 2.6.31-16-generic uhci_hcd"
    ATTRS {product} == "Kontroler hosta UHCI"
    ATTRS {serial} == "0000: 00: 1a.0"
    ATTRS {author_default} == „1”

  patrząc na urządzenie nadrzędne „/devices/pci0000:00/0000:00:1a.0”:
    Jądra == "0000: 00: 1a.0"
    PODSYSTEMY == "pci"
    STEROWNIKI == "uhci_hcd"
    ATTRS {sprzedawca} == "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} == ""

  patrząc na urządzenie nadrzędne '/ devices / pci0000: 00':
    KERNELS == "pci0000: 00"
    PODSYSTEMY == ""
    STEROWNIKI == ""

Więc stworzyłem plik o nazwie /etc/udev/rules.d/usb-keyboard.rules:

# Włącz NumLock, gdy klawiatura jest podłączona.
DZIAŁANIE == „dodaj”, ATTRS {producent} == „Microsoft”, SUBSYSTEM == „wejście”, RUN + = "/ usr / bin / numlockx on"

# Wyłącz NumLock, gdy klawiatura jest odłączona.
DZIAŁANIE == „usuń”, ATTRS {producent} == „Microsoft”, SUBSYSTEM == „wejście”, RUN + = „/ usr / bin / numlockx off”

Użyłem udevadm testdo sprawdzenia, czy reguły są prawidłowe:

> test udevadm --action = add /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21
polecenie_ruchomienia: wywołanie: test
udevadm_test: wersja 147

[...]
plik_parse: czytanie „/etc/udev/rules.d/usb-keyboard.rules” jako pliku reguł
udev_rules_new: reguły używają tokenów 180864 bajtów (15072 * 12 bajtów), buforu 31614 bajtów
udev_rules_new: używany indeks tymczasowy 49760 bajtów (2488 * 20 bajtów)
udev_device_new_from_syspath: urządzenie 0x28d7d80 ma 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: gniazdo RUN: @ / org / freedesktop / hal / udev_event '/lib/udev/rules.d/90-hal.rules:2
udev_device_new_from_syspath: urządzenie 0x28d8560 ma devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1'
udev_device_new_from_syspath: urządzenie 0x28d8708 ma 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 = "Microsoft Natural® 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 = wejście
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'

A oto test „usuń”:

> udevadm test --action = remove /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21

polecenie_ruchomienia: wywołanie: test
udevadm_test: wersja 147

[...]
plik_parse: czytanie „/etc/udev/rules.d/usb-keyboard.rules” jako pliku reguł
udev_rules_new: reguły używają tokenów 180864 bajtów (15072 * 12 bajtów), buforu 31614 bajtów
udev_rules_new: używany indeks tymczasowy 49760 bajtów (2488 * 20 bajtów)
udev_device_new_from_syspath: urządzenie 0xd2fd80 ma devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21'
udev_rules_apply_to_event: gniazdo RUN: @ / org / freedesktop / hal / udev_event '/lib/udev/rules.d/90-hal.rules:2
udev_device_new_from_syspath: urządzenie 0xd2fff8 ma devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1'
udev_device_new_from_syspath: urządzenie 0xd30690 ma 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® 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 = usuń
udevadm_test: SUBSYSTEM = wejście
udevadm_test: run: 'socket: @ / org / freedesktop / hal / udev_event'
udevadm_test: run: '/ usr / bin / numlockx off'

Problem polega na tym, że gdy klawiatura jest podłączona lub odłączona, status NumLock nie zmienia się. Próbowałem zrestartować usługę udev, ale bez powodzenia. Czy moje zasady udev są złe? Czy robię to w niewłaściwy sposób?


Naprawiony! Dzięki tony-p-lee i whitequark za skierowanie mnie we właściwym kierunku.
Eric Heikes,

Odpowiedzi:


4

Problem polega na tym, że prawdopodobnie przetestowałeś numlockx w (jak sama nazwa wskazuje) środowisku X. Klienci X (programy GUI łączące się z serwerem X, np. Firefox lub GEdit) muszą znać serwer, z którym mają się połączyć, a także muszą przejść pewną autoryzację. Spróbuj zalogować się z poziomu zwykłej konsoli, bez względu na użytkownika root lub zwykłego użytkownika, i uruchomić jakąś aplikację GUI: pokaże kilka błędów związanych z WYŚWIETLACZEM, ponieważ nie wie.

Aby to naprawić, musisz ustawić zmienną środowiskową DISPLAY; jeśli masz tylko jeden serwer X, prawie zawsze ma on adres: 0.

Spróbuj tego na zwykłej konsoli: wpisz numlockx on, a wyświetli się „Błąd otwierania wyświetlacza!”. Wpisz DISPLAY=:0 numlockx oni zadziała (przynajmniej dla mnie zadziałało).

Możesz więc ustawić tę zmienną środowiskową w udev lub po prostu uruchomić sh -c 'DISPLAY=:0 numlockx <state>'.


Masz rację! Nie uważałem, że numlockx wymaga środowiska X. Niestety, chociaż ustawienie WYŚWIETLACZA usuwa komunikat o błędzie, nie działa - ani w konsoli, ani przez udev.
Eric Heikes,

Mówiłem za wcześnie. Działa, jeśli uruchomisz powłokę przy użyciu pełnej ścieżki:/bin/sh -c '...'
Eric Heikes,

4

tych dwóch poleceń można często używać do debugowania problemów z udev:

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

Pamiętaj, że argumenty mogą ulec zmianie w różnych wersjach ...


3
Doskonała wskazówka - chociaż na moim udevd nie ma opcji „pełnej”. udevd --debugbyło wszystkim, czego potrzebowałem, aby wyśledzić problem.
Eric Heikes,

@EricHeikes: W końcu udało się uzyskać przydatne informacje, dlaczego skrypty powłoki udev nie działają. Dziękuję Ci!
Mikko Ohtamaa

0

To może być czysty zbieg okoliczności, ale moja reguła udev zaczęła działać, gdy nazwałem ją zaczynając od liczby, np. 80-usb-keyboard.rules.


Też to rozważyłem, ale to nie ma znaczenia.
Eric Heikes,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.