Udev नियम से सूचना-भेजें को कॉल करें


13

मैं लिनक्स मिंट 13 मेट का उपयोग करता हूं, और जब मैं प्लग / अनप्लग उपकरणों को नोटिफाई करने का प्रयास कर रहा हूं।

सबसे पहले, मैंने udv-अधिसूचित पैकेज पाया , लेकिन दुर्भाग्य से यह लगभग मेरे लिए काम नहीं करता है: यह बहुत कम समय (1-2 मिनट) के लिए काम करता है, और फिर, अगर मैं किसी भी डिवाइस को कनेक्ट / डिस्कनेक्ट करता हूं, तो यह क्रैश हो जाता है:

Traceback (most recent call last):
  File "./udev-notify.py", line 319, in <module>
    notification.show()
glib.GError: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name :1.1061 was not provided by any .service files

मुझे कोई समाधान नहीं मिला, इसलिए मुझे इसे हटाना पड़ा। (दर्ज बगरेपोर्ट भी)

हैरानी की बात है, वहाँ कोई समान उपयोगिताओं मैं अब तक पाया है। फिर मैंने udev नियमों को लिखने की कोशिश की जो सभी उपकरणों से मेल खाना चाहिए। मैंने नई फ़ाइल जोड़ी है /etc/udev/rules.d/notify.rules:

ACTION=="add",    RUN+="/bin/bash /home/dimon/tmp/device_plug.sh"
ACTION=="remove", RUN+="/bin/bash /home/dimon/tmp/device_unplug.sh"

और दो स्क्रिप्ट:

device_plug.sh:

#!/bin/bash

export DISPLAY=":0"
notify-send "device plugged"

/usr/bin/play -q /path/to/plug_sound.wav &

device_unplug.sh:

#!/bin/bash

export DISPLAY=":0"
notify-send "device unplugged"

/usr/bin/play -q /path/to/unplug_sound.wav &

यह काम करता है, लेकिन यह बहुत गूंगा काम करता है। मेरे प्रश्न हैं:

  1. डिवाइस के वास्तविक शीर्षक को कैसे संलग्न किया जाए, जैसा कि मैं lsusbआउटपुट में देख सकता हूं ? वर्तमान में, मुझे बस "प्लग-इन" और "अनप्लग्ड" जैसी सूचनाएं मिलीं, और मैं यह नहीं पा सकता कि मैं अपने udev नियम में डिवाइस का नाम कैसे प्राप्त कर सकता हूं (यदि मैं कर सकता हूं, तो मैं इसे अपनी स्क्रिप्ट में पास कर दूंगा पैरामीटर)
  2. वर्तमान में, बहुत सारी सूचनाएं सक्रिय हैं। कहो, जब मैं अपनी USB स्टिक संलग्न करता हूं, तो मुझे लगभग 15 सूचनाएं मिलीं! लेकिन, अगर मैं चलाता हूं, तो lsusbसंलग्न यूएसबी स्टिक को केवल एक उपकरण के रूप में प्रदर्शित किया जाता है। इसलिए, ऐसा लगता है कि मुझे नियम फ़िल्टर करने के लिए कुछ और तर्क जोड़ना चाहिए, लेकिन मैं इसे नहीं खोज सकता।
  3. संभवतः डिवाइस प्लग / अनप्लग सूचनाओं के लिए कुछ बेहतर समाधान है? कृपया सुझाव दें कि क्या आपको कुछ पता है।

जवाबों:


9

खैर, कई घंटों तक गुगली करने और मंचों पर पूछने के बाद, मुझे यह काम करने लगा (ऐसा लगता है)। जो कोई USB डिवाइस प्लग / अनप्लग किया गया है, जब कोई अच्छा दृश्य और / या ऑडियो अधिसूचना प्राप्त करना चाहता है, तो मेरी स्क्रिप्ट स्थापित कर सकता है, नीचे स्थापना विवरण देखें।

सबसे पहले, मेरे अपने सवालों के जवाब।

1. कैसे डिवाइस का वास्तविक शीर्षक संलग्न किया जाए, जैसा कि मैं lsusbआउटपुट में देख सकता हूं ?

कर्नेल में (सामान्य स्थिति में) ऐसा कोई शीर्षक नहीं है। कई जोड़े के लिए शीर्षक के साथ एक डेटाबेस फ़ाइल है vendor_id:product_id, यह आमतौर पर /usr/share/hwdata/usb.idsफ़ाइल है। इस डेटाबेस द्वारा अद्यतन किया जा सकता है /usr/sbin/update-usbids.sh। उस जानकारी के लिए linux.org.ru के दोस्तों का धन्यवाद ।

मुझे नहीं पता कि जोड़ी द्वारा डिवाइस शीर्षक प्राप्त करने के लिए कुछ विशेष उपकरण है vendor_id:product_id, इसलिए मुझे थोड़ा हैक करना पड़ा lsusbऔर grep: उदाहरण के लिए,lsusb | grep '0458:003a'

2. वर्तमान में, बहुत सारी सूचनाएं सक्रिय हैं। कहो, जब मैं अपनी USB स्टिक संलग्न करता हूं, तो मुझे लगभग 15 सूचनाएं मिलीं!

मुझे यह मानना ​​चाहिए कि मुझे इस बात के लिए नियम लिखने की ज़रूरत नहीं है, लेकिन मुझे एक और तरीका मिला जिससे मैं इसे फ़िल्टर कर सकता था।

udevहमें कुछ प्रतिस्थापन के लिए उपयोग करने की अनुमति देता है RUN+="...": कहते हैं, हम क्रमशः $attr{busnum}और $attr{devnum}क्रमशः बस नंबर और डिवाइस नंबर प्राप्त कर सकते हैं। सबसे पहले, मेरी स्क्रिप्ट में मैं विशेष फ़ाइल में संलग्न उपकरणों की सूची संग्रहीत करता हूं, ताकि यदि स्क्रिप्ट को नया "प्लग" ईवेंट मिल जाए, और इस डिवाइस के बसनम और डेवनम पहले से ही हमारी फ़ाइल में संग्रहीत हैं, तो अधिसूचना उत्पन्न नहीं होती है। और दूसरी बात, ये प्रतिस्थापन $attr{busnum}और $attr{devnum}आमतौर पर घटनाओं के "श्रृंखला" से केवल एक उपकरण के लिए उपलब्ध हैं। लेकिन वैसे भी, समझाया एल्गोरिथ्म इसे किसी भी मामले में सुलझाना चाहिए।


वर्तमान परियोजना पृष्ठ: मेरी-udev-सूचना

यह इस तरह दिख रहा है:

यहाँ छवि विवरण दर्ज करें

स्थापना विवरण।

लिनक्स टकसाल 13 पर परीक्षण किया गया, मेरा मानना ​​है कि इसे उबंटू और अन्य उबंटू के डेरिवेटिव पर काम करना चाहिए, और मुझे आशा है कि यह किसी भी * निक्सन के साथ काम करेगा udev

  • प्रोजेक्ट पृष्ठ पर जाएं , वहां से स्रोत प्राप्त करें और उन्हें कहीं रख दें। इसमें केवल एक मुख्य स्क्रिप्ट है: my-udev-notify.shलेकिन संग्रह में प्लग / अनप्लग सूचनाओं के लिए ध्वनियां भी हैं, साथ ही कुछ और जानकारी, readme.txtविवरण के लिए देखें।
  • /etc/udev/rules.d/my-udev-notify.rulesनिम्नलिखित सामग्री के साथ फ़ाइल बनाएँ : (अपने असली पथ पर पथ को संशोधित करने के लिए मत भूलना जहाँ आपने अनपैक किया है my-udev-notify.sh!)

 ACTION=="add",    RUN+="/bin/bash /path/to/my-udev-notify.sh -a add    -p '%p' -b '$attr{busnum}' -d '$attr{devnum}'"
 ACTION=="remove", RUN+="/bin/bash /path/to/my-udev-notify.sh -a remove -p '%p' -b '$attr{busnum}' -d '$attr{devnum}'"

इसके बाद, इसे नए संलग्न उपकरणों के लिए काम करना चाहिए। यही है, यदि आप किसी डिवाइस को अनप्लग करते हैं, तो आपको सूचना नहीं मिलेगी। लेकिन जब आप इसे वापस प्लग करेंगे, तो आप करेंगे। (हाँ, मेरे लिए यह किसी भी udv को फिर से शुरू किए बिना काम करता है। यदि यह आपके लिए नहीं है, तो रिबूट करने का प्रयास करें)

इसे सभी उपकरणों के लिए काम करने के लिए, बस अपने सिस्टम को रिबूट करें। ध्यान दें कि पहले बूट के दौरान कई सूचनाएं हो सकती हैं (ज्ञात समस्याओं को देखें readme.txt)। दूसरे बूट पर, कोई सूचना नहीं होगी (जब तक कि सिस्टम बंद होने पर आप नए डिवाइस में प्लग न करें)

आप इसे कस्टमाइज़ कर सकते हैं (दृश्य / ध्वनि सूचनाओं को चालू / बंद करें, या ध्वनियाँ बदलें), विवरण के लिए संग्रह में readme.txt की जाँच करें।


हो सकता है कि आपको इस प्रश्न / उत्तर पर एक नज़र डालनी चाहिए: stackoverflow.com/questions/469243/… यह pyudevअधिसूचित होने के लिए उपयोग करता है, और इसमें अतिरिक्त स्क्रिप्ट की आवश्यकता नहीं होती है /etc/udev
डेनिलसन सा माया

क्या डिवाइस प्लग / अनप्लग सूचनाएँ डिफ़ॉल्ट रूप से छिपी / अनुपलब्ध हैं?
गोनोबोब्रिन्स

1
@gonzobrains, नहीं, जैसे ही आपने /etc/udeve/rules.d में सही नियम जोड़े, यह नए संलग्न उपकरणों के लिए काम करना चाहिए।
दिमित्री फ्रैंक

@DmitryFrank मेरा क्या मतलब था कि ये सूचनाएं स्वचालित रूप से डिफ़ॉल्ट रूप से दिखाई गई हैं या क्या आपको उन्हें दिखाने के लिए उपरोक्त चरणों का पालन करना है? अपने प्रोजेक्ट के लिए, मैं उन्हें दबाना चाहता हूं (यानी, डिफ़ॉल्ट रूप से कोई सूचना नहीं दिखाई गई है)।
गोनोबोब्रिन्स

1
@gonzobrains, यदि आपने ऊपर दिए गए चरणों का प्रदर्शन नहीं किया है, और आपके पास किसी भी डिवाइस को प्लग / अनप्लग करने पर आपके पास सूचनाएं दिखाई गई हैं, तो मेरी स्क्रिप्ट का इससे कोई लेना-देना नहीं है। कुछ अन्य कार्यक्रम आपके लिए ऐसा करते हैं।
दिमित्री फ्रैंक

0

अपनी दृश्य सूचना लाइनों से पहले निम्नलिखित पंक्तियों को जोड़ें, स्क्रिप्ट को यह अंदाज़ा देने के लिए कि X किस पर प्रदर्शित होना चाहिए notify-send(या किसी अन्य अनुप्रयोग पर):

export DISPLAY=:0
export XAUTHORITY=/var/lib/lightdm/.Xauthority

बेशक, आपको अपने डेस्कटॉप वातावरण (या डिस्प्ले मैनेजर) के अनुसार दूसरी पंक्ति बदलनी होगी। यह लाइन उबंटू 16.04 के लिए ठीक काम करती है जो डेस्कटॉप के रूप में एकता और डिस्प्ले मैनेजर के रूप में लाइटमैड का उपयोग करती है ।

( इस पोस्ट से )


0
sudo -u X_user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/X_userid/bus notify-send 'Hello world!' 

जहां X_user वह उपयोगकर्ता है जिसे आप चलाना चाहते हैं, और X_userid उपयोगकर्ता की समूह आईडी है

उदाहरण बिगबर्ड और 1000

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