Script dalam aturan udev tidak berjalan

8

Saya menjalankan Ubuntu 9.10 (Karmic Koala) di laptop dan ingin NumLock untuk secara otomatis beralih tergantung pada apakah keyboard USB saya terhubung (numlock on) atau dicabut (numlock off).

Untuk mencapai ini, saya pertama kali menginstal paket "numlockx". numlockx ondan numlockx offbekerja dengan baik.

Untuk menghubungkan ke sistem perangkat, saya pikir saya akan menggunakan udev. Saya telah membaca "Menulis aturan udev" , tetapi saya mengalami masalah dalam menjalankan aturan udev.

Pertama, inilah contoh dmesgoutputnya:

[20906.985102] usb 3-2: perangkat USB kecepatan rendah baru menggunakan uhci_hcd dan alamat 6
[20907.166403] usb 3-2: konfigurasi # 1 dipilih dari 1 pilihan
[20907.192904] masukan: Microsoft Natural® Ergonomic Keyboard 4000 sebagai /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 [Microsoft Natural® Ergonomic Keyboard 4000] di usb-0000: 00: 1a.0-2 / input0
[20907.217810] masukan: Microsoft Natural® Ergonomic Keyboard 4000 sebagai /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: Perangkat USB HID v1.11 [Microsoft Natural® Ergonomic Keyboard 4000] di usb-0000: 00: 1a.0-2 / input1

Saya biasa udevadm infomengumpulkan info perangkat:

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

  melihat perangkat '/ perangkat/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, 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 "

  melihat perangkat induk '/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 {support_autosuspend} == "1"

  melihat perangkat induk '/devices/pci0000:00/0000:00:1a.0/usb3/3-2':
    KERNELS == "3-2"
    SUBSYSTEMS == "usb"
    DRIVERS == "usb"
    ATTRS {konfigurasi} == ""
    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 {berwenang} == "1"
    ATTRS {manufacturer} == "Microsoft"

  melihat perangkat induk '/ tools/pci0000:00/0000:00:1a.0/usb3':
    KERNELS == "usb3"
    SUBSYSTEMS == "usb"
    DRIVERS == "usb"
    ATTRS {konfigurasi} == ""
    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 {berwenang} == "1"
    ATTRS {manufacturer} == "Linux 2.6.31-16-generic uhci_hcd"
    ATTRS {product} == "Pengontrol Host UHCI"
    ATTRS {serial} == "0000: 00: 1a.0"
    ATTRS {berwenang_default} == "1"

  melihat perangkat induk '/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: v00008086d00002937sv00001515sd00000860bc0Csc03i00"
    ATTRS {broken_parity_status} == "0"
    ATTRS {msi_bus} == ""

  melihat perangkat induk '/ perangkat / pci0000: 00':
    KERNELS == "pci0000: 00"
    SUBSYSTEMS == ""
    PENGEMUDI == ""

Jadi saya membuat file bernama /etc/udev/rules.d/usb-keyboard.rules:

# Nyalakan NumLock saat keyboard dicolokkan.
ACTION == "add", ATTRS {manufacturer} == "Microsoft", SUBSYSTEM == "input", RUN + = "/ usr / bin / numlockx on"

# Matikan NumLock saat keyboard dicabut.
ACTION == "hapus", ATTRS {manufacturer} == "Microsoft", SUBSYSTEM == "input", RUN + = "/ usr / bin / numlockx off"

Saya sudah terbiasa udevadm testmemverifikasi bahwa aturannya benar:

> tes udevadm --action = add /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21
run_command: calling: test
udevadm_test: versi 147

[...]
parse_file: membaca '/etc/udev/rules.d/usb-keyboard.rules' sebagai file aturan
udev_rules_new: aturan menggunakan token 180864 byte (15072 * 12 byte), penyangga 31614 byte
udev_rules_new: indeks sementara digunakan 49760 byte (2488 * 20 byte)
udev_device_new_from_syspath: perangkat 0x28d7d80 memiliki 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#
udev_rules_apply_to_event: RUN 'socket: @ / org / freedesktop / hal / udev_event' /lib/udev/rules.d/90-hal.rules:
udev_device_new_from_syspath: perangkat 0x28d8560 memiliki devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1'
udev_device_new_from_syspath: perangkat 0x28d8708 memiliki devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2'
udev_rules_apply_to_event: RUN '/ usr / bin / numlockx di' /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,75,77,79,7A, 7B, 7C, 7D, 7E, 7F, 80F, 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, 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, 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, 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, 1A0, 1B0.1B1.1B7, r6 , a20, m4, lsfw '
udevadm_test: run: 'socket: @ / org / freedesktop / hal / udev_event'
udevadm_test: run: '/ usr / bin / numlockx on'

Dan inilah tes "hapus":

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

run_command: calling: test
udevadm_test: versi 147

[...]
parse_file: membaca '/etc/udev/rules.d/usb-keyboard.rules' sebagai file aturan
udev_rules_new: aturan menggunakan token 180864 byte (15072 * 12 byte), penyangga 31614 byte
udev_rules_new: indeks sementara digunakan 49760 byte (2488 * 20 byte)
udev_device_new_from_syspath: perangkat 0xd2fd80 memiliki 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:
udev_device_new_from_syspath: device 0xd2fff8 memiliki devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1'
udev_device_new_from_syspath: perangkat 0xd30690 memiliki 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,75,77,79,7A, 7B, 7C, 7D, 7E, 7F, 80F, 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, 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 = hapus
udevadm_test: SUBSYSTEM = input
udevadm_test: run: 'socket: @ / org / freedesktop / hal / udev_event'
udevadm_test: run: '/ usr / bin / numlockx off'

Masalahnya adalah ketika keyboard dicolokkan atau dicabut, status NumLock tidak berubah. Saya telah mencoba memulai kembali layanan udev, tanpa hasil. Apakah aturan udev saya salah? Apakah saya salah tentang hal ini?

Eric Heikes
sumber
Tetap! Terima kasih kepada tony-p-lee dan whitequark karena mengarahkan saya ke arah yang benar.
Eric Heikes

Jawaban:

5

Masalahnya adalah bahwa Anda mungkin telah menguji numlockx di (seperti namanya) pada beberapa lingkungan X. Klien X (program GUI yang terhubung ke server X, mis. Firefox atau GEdit) perlu mengetahui server yang akan dihubungkan, dan juga harus melewati semacam otorisasi. Coba masuk dari konsol biasa, tidak peduli oleh pengguna root atau biasa, dan memulai beberapa aplikasi GUI: itu akan menampilkan beberapa kesalahan terkait DISPLAY karena tidak tahu.

Untuk memperbaikinya, Anda perlu mengatur DISPLAY variabel lingkungan; jika Anda hanya memiliki satu server X, hampir selalu memiliki alamat: 0.

Coba ini di konsol biasa: ketik numlockx on, dan itu akan menampilkan "Kesalahan membuka tampilan!". Ketik DISPLAY=:0 numlockx on, dan itu akan berhasil (setidaknya bekerja untuk saya).

Jadi, Anda dapat mengatur variabel lingkungan ini di udev atau hanya meluncurkan sh -c 'DISPLAY=:0 numlockx <state>'.

whitequark
sumber
Kamu benar! Saya tidak menganggap bahwa numlockx membutuhkan lingkungan X. Sayangnya, meskipun mengatur DISPLAY menghilangkan pesan kesalahan, itu tidak berfungsi - baik di konsol atau melalui udev.
Eric Heikes
Berbicara terlalu cepat. Ini berfungsi jika Anda menjalankan shell menggunakan path lengkap:/bin/sh -c '...'
Eric Heikes
4

dua perintah ini dapat digunakan untuk banyak men-debug masalah udev:

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

Perhatikan bahwa args dapat berubah pada versi yang berbeda ...

tony-p-lee
sumber
3
Tip luar biasa - meskipun tidak ada opsi "verbose" di udevd saya. udevd --debughanya itu yang saya butuhkan untuk melacak masalahnya.
Eric Heikes
@EricHeikes: Akhirnya berhasil mendapatkan beberapa hasil yang bermanfaat mengapa skrip udev shell tidak berfungsi. Terima kasih!
Mikko Ohtamaa
0

Ini mungkin kebetulan murni, tetapi aturan udev saya mulai bekerja ketika saya menamakannya dimulai dengan angka, misalnya. 80-usb-keyboard.rules.

Blorgbeard keluar
sumber
Saya telah mempertimbangkan itu juga, tetapi tidak ada bedanya.
Eric Heikes