2010-01-12 10 views
2

랩톱에서 Ubuntu 9.10 (Karmic Koala)을 실행 중이며 NumLock이 내 USB 키보드가 연결되어 있는지 (numlock on) 또는 연결 해제되어 있는지 (numlock off)에 따라 자동으로 전환되도록하고 싶습니다. .udev 규칙의 스크립트가 실행되지 않습니다

이 작업을 수행하기 위해 먼저 "numlockx"패키지를 설치했습니다. numlockx onnumlockx off이 문제가 없습니다.

장치 시스템에 연결하려면 udev를 사용해야한다고 생각했습니다. StackOverflow에서 다른 질문을보고 "Writing udev rules"을 읽었습니다. 하지만 udev 규칙을 적용하는 데 문제가 있습니다.

 
[20906.985102] usb 3-2: new low speed USB device using uhci_hcd and address 6 
[20907.166403] usb 3-2: configuration #1 chosen from 1 choice 
[20907.192904] input: Microsoft Natural® 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 [Microsoft Natural® Ergonomic Keyboard 4000] on usb-0000:00:1a.0-2/input0 
[20907.217810] input: 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: input,hidraw2: USB HID v1.11 Device [Microsoft Natural® Ergonomic Keyboard 4000] on usb-0000:00:1a.0-2/input1 

나는 장치 정보를 수집하는 udevadm info을 사용 :

 
# Turn on NumLock when keyboard is plugged in. 
ACTION=="add", ATTRS{manufacturer}=="Microsoft", SUBSYSTEM=="input", RUN+="/usr/bin/numlockx on" 

# Turn off NumLock when keyboard is unplugged. 
ACTION=="remove", ATTRS{manufacturer}=="Microsoft", SUBSYSTEM=="input", RUN+="/usr/bin/numlockx off" 
:
 
> udevadm info -a -p /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 

    looking at device '/devices/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,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" 

    looking at parent device '/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" 

    looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb3/3-2': 
    KERNELS=="3-2" 
    SUBSYSTEMS=="usb" 
    DRIVERS=="usb" 
    ATTRS{configuration}=="" 
    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{authorized}=="1" 
    ATTRS{manufacturer}=="Microsoft" 

    looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb3': 
    KERNELS=="usb3" 
    SUBSYSTEMS=="usb" 
    DRIVERS=="usb" 
    ATTRS{configuration}=="" 
    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{authorized}=="1" 
    ATTRS{manufacturer}=="Linux 2.6.31-16-generic uhci_hcd" 
    ATTRS{product}=="UHCI Host Controller" 
    ATTRS{serial}=="0000:00:1a.0" 
    ATTRS{authorized_default}=="1" 

    looking at parent device '/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:v00008086d00002937sv00001558sd00000860bc0Csc03i00" 
    ATTRS{broken_parity_status}=="0" 
    ATTRS{msi_bus}=="" 

    looking at parent device '/devices/pci0000:00': 
    KERNELS=="pci0000:00" 
    SUBSYSTEMS=="" 
    DRIVERS=="" 

그래서 내가 /etc/udev/rules.d/usb-keyboard.rules라는 파일을 생성을

첫째, 여기에 dmesg 출력의 예

나는을 사용했습니다.

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

[...] 
parse_file: reading '/etc/udev/rules.d/usb-keyboard.rules' as rules file 
udev_rules_new: rules use 180864 bytes tokens (15072 * 12 bytes), 31614 bytes buffer 
udev_rules_new: temporary index used 49760 bytes (2488 * 20 bytes) 
udev_device_new_from_syspath: device 0x28d7d80 has 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: device 0x28d8560 has devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1' 
udev_device_new_from_syspath: device 0x28d8708 has 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=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: run: 'socket:@/org/freedesktop/hal/udev_event' 
udevadm_test: run: '/usr/bin/numlockx on' 

을 그리고 여기에 "제거"테스트입니다 : 0 규칙이 올바른지 확인하기 위해 키보드를 연결하거나 분리 할 때

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

run_command: calling: test 
udevadm_test: version 147 

[...] 
parse_file: reading '/etc/udev/rules.d/usb-keyboard.rules' as rules file 
udev_rules_new: rules use 180864 bytes tokens (15072 * 12 bytes), 31614 bytes buffer 
udev_rules_new: temporary index used 49760 bytes (2488 * 20 bytes) 
udev_device_new_from_syspath: device 0xd2fd80 has 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: device 0xd2fff8 has devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1' 
udev_device_new_from_syspath: device 0xd30690 has 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=remove 
udevadm_test: SUBSYSTEM=input 
udevadm_test: run: 'socket:@/org/freedesktop/hal/udev_event' 
udevadm_test: run: '/usr/bin/numlockx off' 

문제는, 숫자 잠금 상태가 수행되지 않도록 변화. 운이없는 udev 서비스를 다시 시작하려고했습니다. 내 udev 규칙이 잘못 되었습니까? 내가 잘못된 방향으로가는거야?

답변

1
  1. 이것에 대해 매우 지식이 아니지만, 내 생각 엔 키보드 상태가 udev에보다 높은 수준에서 앉아 X11 "배관"에 의해 관리되고 있다는 것, 그래서 당신이 아래로 어떻게하든 점점 오버라이드되고있다. /etc/X11의 구성 파일을 살펴보면 더 많은 것을 알 수 있습니다.

  2. 이 질문에 대한 답변은 수퍼 유저 웹 사이트 (이 페이지의 맨 아래 링크)에서 얻을 수 있습니다. 나는 당신의 질문을 여기서 끝내기 위해 투표하지 않을 것이지만, 다른 질문은 끝낼 수 있습니다.

+0

팁 주셔서 감사합니다. 수퍼 유저에게 복사 됨 : http://superuser.com/questions/95187/script-in-udev-rule-doesnt-run –

관련 문제