Udv नियम में स्क्रिप्ट नहीं चलती है


8

मैं एक लैपटॉप पर उबंटू 9.10 (कार्मिक कोआला) चला रहा हूं और अपने यूएसबी कीबोर्ड प्लग इन (नॉकलॉक) या अनप्लग्ड (नॉकलॉक) के आधार पर स्वचालित रूप से टॉगल करने के लिए न्यूक्लॉक पसंद करेगा।

इसे पूरा करने के लिए, मैंने पहली बार "न्यूक्लॉक्स" पैकेज स्थापित किया। numlockx onऔर numlockx offठीक काम करता है।

डिवाइस सिस्टम में हुक करने के लिए, मुझे लगा कि मैं udev का उपयोग करूंगा। मैंने "लेखन udev नियम" पढ़ा है , लेकिन मुझे काम करने के लिए udv नियम प्राप्त करने में परेशानी हो रही है।

सबसे पहले, यहाँ dmesgआउटपुट का एक उदाहरण है :

[20906.985102] usb 3-2: uhci_hcd और एड्रेस 6 का उपयोग करके नई कम गति वाली USB डिवाइस
[20907.166403] usb 3-2: कॉन्फ़िगरेशन # 1 को 1 पसंद से चुना गया
[20907.192904] इनपुट: Microsoft प्राकृतिक® Ergonomic कीबोर्ड 4000 /देवियों /pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.0/input/input20 के रूप में
[20907.193100] Microsoft 0003: 045E: 00DB.000B: इनपुट, hidraw1: USB छिपाई v1.11 कीबोर्ड [Microsoft Natural® Ergonomic Keyboard 4000] usb-0000: 00: 1: 00-2-2 / input0 पर
[२० ९ ० Natural.२१1010१०] इनपुट: Microsoft नेचुरल® एर्गोनोमिक कीबोर्ड ४००० /देवियों के रूप में /pci0000:00/0000:00:१a.0/usb3/3-2/3-2:1.1/input/input21
[20907.217979] Microsoft 0003: 045E: 00DB.000C: इनपुट, hidraw2: USB छिपाई v1.11 डिवाइस [Microsoft Natural® Ergonomic Keyboard 4000] usb-0000: 00: 1: 00-2-2 / input1 पर

मैं udevadm infoउपकरण जानकारी एकत्र करता था:

> udvadm जानकारी -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':
    कर्नेल == "input21"
    सबसिस्टम == "इनपुट"
    ड्राइवर == ""
    ATTR {Phys} == "USB-0000: 00: 1a.0-2 / इनपुट 1"
    ATTR {uniq} == ""
    ATTR {modalias} == "इनपुट: b0003v045Ep00DBe0111-e0,1,2,3,4,14, k71,72,73,74,75,77,79,7A, 7 बी, 7, 7 दिन, 7E, 7F, 80 , 81,82,83,84,85,86,87,88,89,8A, 8 बी, 8C, 8E, 90,96,98,9B, 9, 9E, 9 फ, A1, A3, A4, A5, A6 , ए 7, ए 8, ए 9, अटल बिहारी, एसी, ई, एई, B0, बी 1, बी 2, बी 3, बी 4, B5, बी 6, बी 8, B9, बीए, बी बी, ई.पू., बीडी, बीई, बीएफ, C0, C1, C2 , सीई, सीएफ, D0, डी 1, डी 2, D5, D9, डीबी, DF, E2, E7, E8, E9, ईए, ईबी, 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' को देख रहे हैं:
    गुठली == "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' देख रहे हैं:
    गुठली == "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 {निर्माता} == "माइक्रोसॉफ्ट"

  मूल उपकरण '/devices/pci0000:00/0000:00:1a.0/usb3' देख रहे हैं:
    गुठली == "USB3"
    उप == "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"
    एटीटीआरएस {संस्करण} == "1.10"
    ATTRS {maxchild} == "2"
    ATTRS {quirks} == "0x0"
    ATTRS {अधिकृत} == "1"
    ATTRS {निर्माता} == "लिनक्स 2.6.31-16- जेनेरिक uhci_hcd"
    ATTRS {उत्पाद} == "UHCI होस्ट कंट्रोलर"
    ATTRS {serial} == "0000: 00: 1a.0"
    ATTRS {authorized_default} == "1"

  मूल उपकरण '/devices/pci0000:00/0000:00:1a.0' देख रहे हैं:
    गुठली == "0000: 00: 1a.0"
    उप == "पीसीआई"
    ड्राइवरों == "uhci_hcd"
    ATTRS {विक्रेता} == "0x8086"
    ATTRS {device} == "0x2937"
    ATTRS {subsystem_vendor} == "0x1558"
    ATTRS {subsystem_device} == "0x0860"
    ATTRS {वर्ग} == "0x0c0300"
    ATTRS {आईआरक्यू} == "16"
    ATTRS {local_cpus} == "एफएफ"
    ATTRS {local_cpulist} == "0-7"
    ATTRS {modalias} == "पीसीआई: v00008086d00002937sv00001558sd00000860bc0Csc03i00"
    ATTRS {broken_parity_status} == "0"
    ATTRS {msi_bus} == ""

  मूल उपकरण '/ उपकरणों / pci0000: 00' को देखना:
    गुठली == "pci0000: 00"
    उप == ""
    ड्राइवरों == ""

इसलिए मैंने एक फाइल बनाई जिसका नाम है /etc/udev/rules.d/usb-keyboard.rules:

# कीबोर्ड प्लग इन होने पर न्यूक्लॉक को चालू करें।
ACTION == "जोड़ें", ATTRS {निर्माता} == "Microsoft", SUBSYSTEM == "इनपुट", RUN + = "/ usr / bin / numlockx"

# कीबोर्ड अनप्लग होने पर न्यूक्लॉक को बंद कर दें।
ACTION == "हटाएं", ATTRS {निर्माता} == "Microsoft", SUBSYSTEM == "इनपुट", RUN + = "/ usr / bin / numlockx off"

मैंने यह udevadm testसत्यापित करने के लिए उपयोग किया है कि नियम सही हैं:

> udvadm test --action = add /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21
run_command: कॉलिंग: टेस्ट
udvadm_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 में देवपथ है / 'देवियाँ /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 'सॉकेट: @ / org / freedesktop / hal / udev_event' /lib/udev/rules.d/90-hal.rules2
udev_device_new_from_syspath: डिवाइस 0x28d8560 में devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2-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 पर
udvadm_test: UDEV_LOG = 6
udvadm_test: DEVPATH = / devices / pci0000: 00/0000: 00: 1a.0 / usb3 / 3-2 / 3-2: 1.1 / input / input21
udvadm_test: PRODUCT = 3 / 45e / db / 111
udvadm_test: NAME = "Microsoft प्राकृतिक® Ergonomic कीबोर्ड 4000"
udvadm_test: PHYS = "usb-0000: 00: 1a.0-2 / input1"
udvadm_test: UNIQ = ""
udvadm_test: EV == 10001f
udvadm_test: KEY == 837fff 2c3027 bf004444 0 0 1 10f84 8a27c007 ff7f7bfa d9415fff febeffdf ffefffff ffffffff fffffffe
udvadm_test: REL == 40
udvadm_test: ABS == 1 0
udvadm_test: MSC == 10
udvadm_test: MODALIAS = इनपुट: b0003v045Ep00DBe0111-e0,1,2,3,4,14, k71,72,73,74,75,77,79,7A, 7B, 7C, 7D, 7E, 7F, 7F, 80,81, 80,81 82,83,84,85,86,87,88,89,8A, 8 बी, 8C, 8E, 90,96,98,9B, 9, 9E, 9 फ, A1, A3, A4, A5, A6, ए 7, ए 8, ए 9, अटल बिहारी, एसी, ई, एई, B0, बी 1, बी 2, बी 3, बी 4, B5, बी 6, बी 8, B9, बीए, बी बी, ई.पू., बीडी, बीई, बीएफ, C0, C1, C2, सीई, सीएफ, D0, डी 1, डी 2, D5, D9, डीबी, DF, E2, E7, E8, E9, ईए, ईबी, 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
udvadm_test: ACTION = जोड़ें
udvadm_test: SUBSYSTEM = इनपुट
udvadm_test: run: '/ sbin / modprobe -b इनपुट: b0003v045Ep00DBe0111-e0,1,2,3,4,14, k71,72,73,74,75,77,79,7A, 7B, 7C, 7D, 7E, 7E , 7F, 80,81,82,83,84,85,86,87,88,89,8A, 8 बी, 8C, 8E, 90,96,98,9B, 9, 9E, 9 फ, A1, A3, A4 , A5, A6, ए 7, ए 8, ए 9, अटल बिहारी, एसी, ई, एई, B0, बी 1, बी 2, बी 3, बी 4, B5, बी 6, बी 8, B9, बीए, बी बी, ई.पू., बीडी, बीएफ बीई, C0 , C1, C2, सीई, सीएफ, D0, डी 1, डी 2, D5, D9, डीबी, DF, E2, E7, E8, E9, ईए, ईबी, 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 '
udvadm_test: run: 'सॉकेट: @ / org / freedesktop / hal / udevmee'
udvadm_test: run: '/ usr / bin / numlockx on'

और यहाँ "निकालें" परीक्षण है:

> udvadm test --action = निकालें /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21

run_command: कॉलिंग: टेस्ट
udvadm_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 में देवपथ है / 'देवियाँ /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.rules2
udev_device_new_from_syspath: डिवाइस 0xd2fff8 में devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2-2.1.1' है।
udev_device_new_from_syspath: डिवाइस 0xd30690 में देवपथ है / 'देवियाँ /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:10
udvadm_test: UDEV_LOG = 6
udvadm_test: DEVPATH = / devices / pci0000: 00/0000: 00: 1a.0 / usb3 / 3-2 / 3-2: 1.1 / input / input21
udvadm_test: PRODUCT = 3 / 45e / db / 111
udvadm_test: NAME = "Microsoft प्राकृतिक® Ergonomic कीबोर्ड 4000"
udvadm_test: PHYS = "usb-0000: 00: 1a.0-2 / input1"
udvadm_test: UNIQ = ""
udvadm_test: EV == 10001f
udvadm_test: KEY == 837fff 2c3027 bf004444 0 0 1 10f84 8a27c007 ff7f7bfa d9415fff febeffdf ffefffff ffffffff fffffffe
udvadm_test: REL == 40
udvadm_test: ABS == 1 0
udvadm_test: MSC == 10
udvadm_test: MODALIAS = इनपुट: b0003v045Ep00DBe0111-e0,1,2,3,4,14, k71,72,73,74,75,77,79,7A, 7B, 7C, 7D, 7E, 7F, 7F, 80,81, 80,81 82,83,84,85,86,87,88,89,8A, 8 बी, 8C, 8E, 90,96,98,9B, 9, 9E, 9 फ, A1, A3, A4, A5, A6, ए 7, ए 8, ए 9, अटल बिहारी, एसी, ई, एई, B0, बी 1, बी 2, बी 3, बी 4, B5, बी 6, बी 8, B9, बीए, बी बी, ई.पू., बीडी, बीई, बीएफ, C0, C1, C2, सीई, सीएफ, D0, डी 1, डी 2, D5, D9, डीबी, DF, E2, E7, E8, E9, ईए, ईबी, 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
udvadm_test: ACTION = निकालें
udvadm_test: SUBSYSTEM = इनपुट
udvadm_test: run: 'सॉकेट: @ / org / freedesktop / hal / udevmee'
udvadm_test: run: '/ usr / bin / numlockx off'

समस्या यह है कि जब कीबोर्ड प्लग या अनप्लग होता है, तो NumLock स्टेटस नहीं बदलता है। मैंने udv सेवा को पुनः आरंभ करने की कोशिश की है, जिसमें कोई भाग्य नहीं है। क्या मेरे udv नियम गलत हैं? क्या मैं इसके बारे में गलत तरीके से जा रहा हूं?


फिक्स्ड! सही दिशा में मुझे इंगित करने के लिए टोनी-पी-ली और व्हाइटवार्क के लिए धन्यवाद।
एरिक हीक्स

जवाबों:


5

समस्या यह है कि आपने शायद कुछ X वातावरण में (जैसा कि यह नाम से पता चलता है) में numlockx का परीक्षण किया है। X क्लाइंट (GUI प्रोग्राम जो X सर्वर से जुड़ते हैं, जैसे फ़ायरफ़ॉक्स या GEdit) से कनेक्ट होने के लिए सर्वर को जानना आवश्यक है, और किसी प्रकार का प्राधिकरण भी पास करना होगा। सादे कंसोल से लॉग इन करने की कोशिश करें, रूट या सादे उपयोगकर्ता द्वारा कोई फर्क नहीं पड़ता, और कुछ GUI अनुप्रयोग शुरू करना: यह कुछ DISPLAY संबंधित त्रुटियों को दिखाएगा क्योंकि यह नहीं जानता है।

इसे ठीक करने के लिए आपको पर्यावरण चर DISPLAY सेट करना होगा; यदि आपके पास केवल एक एक्स सर्वर है तो इसका लगभग हमेशा पता है: 0।

सादे कंसोल पर इसे आज़माएँ: टाइप करें numlockx on, और यह "एरर ओपनिंग डिस्प्ले!" दिखाएगा। टाइप करें DISPLAY=:0 numlockx on, और यह काम करेगा (कम से कम मेरे लिए काम किया)।

तो आप इस पर्यावरण चर को udv में सेट कर सकते हैं या सिर्फ लॉन्च कर सकते हैं sh -c 'DISPLAY=:0 numlockx <state>'


आप सही हे! मैंने यह नहीं माना था कि न्यूक्लॉक्स के लिए X वातावरण की आवश्यकता होती है। दुर्भाग्यवश, हालाँकि DISPLAY सेट करने से त्रुटि संदेश से छुटकारा मिल जाता है, यह काम नहीं करता है - या तो कंसोल में या udev के माध्यम से।
एरिक हेक्स

बहुत जल्द बोला। यह काम करता है यदि आप पूर्ण पथ का उपयोग करके शेल चलाते हैं:/bin/sh -c '...'
एरिक हाइक्स

4

इन दो आदेशों का उपयोग udv समस्याओं को डीबग करने के लिए किया जा सकता है:

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

ध्यान दें कि विभिन्न संस्करणों पर आर्ग परिवर्तन हो सकते हैं ...


3
उत्कृष्ट टिप - हालांकि मेरे udvd पर कोई "क्रिया" विकल्प नहीं है। udevd --debugक्या मुझे समस्या को ट्रैक करने की आवश्यकता थी।
एरिक हेक्स

@EricHeikes: अंत में कुछ उपयोगी उत्पादन पाने में कामयाब क्यों udev खोल स्क्रिप्ट काम नहीं करते। धन्यवाद!
मिको ओक्टामा

0

यह विशुद्ध संयोग हो सकता है, लेकिन मेरे udv नियम ने तब काम करना शुरू किया जब मैंने इसे एक नंबर से शुरू किया, जैसे। 80-usb-keyboard.rules


मैंने उस पर भी विचार किया था, लेकिन इससे कोई फर्क नहीं पड़ा।
एरिक हेक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.