Wifi कार्ड (udev) प्लग इन होने पर ऑटो-रन स्क्रिप्ट


9

मैं udevएक वायरलेस कार्ड कनेक्ट होने पर डेबियन सिस्टम को बैश स्क्रिप्ट चलाने के लिए उपयोग करने की कोशिश कर रहा हूं ।

अब तक मैंने यह फाइल बनाई /etc/udev/rules.d/wifi-detect.rules:

ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/root/test.sh"

और अभी के लिए, मैं test.shइस सामग्री के साथ काम करने की कोशिश कर रहा हूँ :

#!/bin/bash
/bin/echo "test!" > /test.txt

लेकिन किसी कारण से, ऐसा कुछ भी नहीं होता है जब मैं वायरलेस कार्ड को जोड़ता हूं, कोई test.txtफ़ाइल नहीं बनाई गई है।

मेरे lsusbकार्ड पर:

Bus 001 Device 015: ID 0cf3:9271 Atheros Communications, Inc. AR9271 802.11n

चल रहा है udevadm monitor –envयह है कि क्या होता है जब मैं कार्ड कनेक्ट है:

KERNEL[1017.642278] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3 (usb)
KERNEL[1017.644676] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0 (usb)
KERNEL[1017.645035] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
KERNEL[1017.708056] remove   /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
UDEV  [1017.714772] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3 (usb)
UDEV  [1017.733002] remove   /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
UDEV  [1017.772669] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
UDEV  [1017.798707] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0 (usb)
KERNEL[1018.456804] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/ieee80211/phy8 (ieee80211)
KERNEL[1018.465994] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan0 (net)
KERNEL[1018.479878] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/leds/ath9k_htc-phy8 (leds)
KERNEL[1018.483074] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/usb_device/usbdev1.20 (usb_device)
UDEV  [1018.600456] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/leds/ath9k_htc-phy8 (leds)
UDEV  [1018.604376] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/ieee80211/phy8 (ieee80211)
UDEV  [1018.626243] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/usb_device/usbdev1.20 (usb_device)
KERNEL[1018.659318] move     /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan1 (net)
UDEV  [1018.758843] add      /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan1 (net)
UDEV  [1018.932207] move     /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan1 (net)

मैंने बहुत सारे उदाहरणों की कोशिश की है, लेकिन मैं इसे काम नहीं कर सकता। मुझे उम्मीद है कि कोई मेरी मदद कर सकता है;) धन्यवाद!


संपादित करें:

बात को आसान बनाने के लिए, मैंने अपना नियम बदल दिया:

ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/bin/echo 'test' > /test.txt"

मैंने udevadm control --log-priority=info@ user1146332 के रूप में सेट करने में कामयाब रहा और मुझे यह दिलचस्प लॉग मिला:

Sep  9 16:27:53 iklive-rpi1 udevd[1537]: RUN '/bin/echo 'test' > /test.txt' /etc/udev/rules.d/wifi-detect.rules:1
Sep  9 16:27:53 iklive-rpi1 udevd[1544]: starting 'firmware.agent'
Sep  9 16:27:53 iklive-rpi1 udevd[126]: seq 663 queued, 'remove' 'firmware'
Sep  9 16:27:53 iklive-rpi1 udevd[126]: seq 663 forked new worker [1547]
Sep  9 16:27:53 iklive-rpi1 udevd[1537]: 'firmware.agent' [1544] exit with return code 0
Sep  9 16:27:53 iklive-rpi1 udevd[1548]: starting '/bin/echo 'test' > /test.txt'
Sep  9 16:27:53 iklive-rpi1 udevd[1547]: seq 663 running
Sep  9 16:27:53 iklive-rpi1 udevd[1547]: no db file to read /run/udev/data/+firmware:1-1.3.4: No such file or directory
Sep  9 16:27:53 iklive-rpi1 udevd[1547]: passed -1 bytes to netlink monitor 0x1af5ee0
Sep  9 16:27:53 iklive-rpi1 udevd[126]: seq 663 done with 0
Sep  9 16:27:53 iklive-rpi1 udevd[1547]: seq 663 processed with 0
Sep  9 16:27:53 iklive-rpi1 udevd[1537]: '/bin/echo 'test' > /test.txt'(out) 'test > /test.txt'
Sep  9 16:27:53 iklive-rpi1 udevd[1537]: '/bin/echo 'test' > /test.txt' [1548] exit with return code 0

इसलिए ... return code 0सफल समापन के लिए निकास कोड नहीं है ? यदि ऐसा है तो मुझे सिस्टम पर कोई फ़ाइल क्यों नहीं मिल रही है?


संपादित करें 2:

मैं @htor द्वारा टिप का उपयोग करके यह काम पाने में कामयाब रहा। मेरा वर्तमान नियम:

ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"

लेकिन किसी कारण से कमांड को 8 बार निष्पादित किया जाता है, क्या इससे बचने का कोई तरीका है? मुझे लगता है कि हो रहा है क्योंकि जब वायरलेस कार्ड ड्राइवरों को लोड किया जा रहा है तो उन्हें कार्ड को वस्तुतः अनमाउंट करने और माउंट करने की आवश्यकता होती है। युक्तियाँ?


1
EDIT से संबंधित: मुझे यकीन है कि /bin/echoआपके लॉग सुझाव के अनुसार सफलतापूर्वक निष्पादित किया गया था। आपकी कमांड का आउटपुट test > /test.txtआपके लॉग स्टेट्स के रूप में है। इसका कारण यह है, कि >आपके संदर्भ में चरित्र का कोई विशेष अर्थ नहीं है। यह केवल तीसरी कमांड लाइन तर्क है जिसे आपने पास किया है echo। यदि आप अपने शेल को दिए गए लाइन की व्याख्या करने देते हैं तो आप जो चाहते हैं, वह आपको मिलता है /bin/echo 'test' > /test.txt। जैसे आपने अपने दूसरे EDIT में किया है। उदाहरण के लिए यदि आपने जो किया है उसके विपरीत udevनिष्पादित होने दें, तो आपको touch /test.txtअपनी जड़ में एक नई फ़ाइल दिखाई देगी।
उपयोगकर्ता 1146332 19

जवाबों:


4

मुझे थोड़ी देर पहले एक समस्या थी और इसका समाधान यह था कि RUN+=भाग को बदल दिया जाएRUN+="sh -c '/root/test.sh'" । अब, मुझे नहीं पता कि आपको इसकी आवश्यकता है कि इस मामले में क्योंकि नियम एक स्क्रिप्ट को बुला रहा है, न कि एक कमांड।

एक और अवलोकन: स्ट्रिंग !से हटाने की कोशिश करें "test!"या सिंगल-कोट्स के साथ डबल-कोट्स को बदलें। !खोल में विशेष अर्थ के कारण धमाका शायद मुश्किल कर रहा है और दोहरे उद्धरण उस अर्थ को संरक्षित करता है।


इसके साथ या इसके बिना !काम नहीं हो रहा है।
TCB13

RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"काम करता है, लेकिन किसी कारण से ई फाइल में 8 बार "परीक्षण" लिखा गया। आदेश की तरह कई बार निष्पादित किया जा रहा है: एस
TCB13

3

मेरी सलाह होगी कि के साथ udevसे लॉगिंग प्राथमिकता निर्धारित करेंerrinfo

 udevadm control --log-priority=info

यदि आप और भी अधिक जानकारी देखना चाहते हैं तो इसे सेट करें debug। अब आप बहुत विस्तृत जानकारी पा सकते हैं कि (कम से कम एक डेबियन संबंधित प्रणाली पर) क्या udevकिया /var/log/daemon.log। आम तौर पर यह त्रुटियों का पीछा करने में बहुत मदद करता है।

यह केवल htor के उत्तर का पूरक है जो संभवतः आपकी समस्या को हल करता है।

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