जब एक विशेष फ्लैश-ड्राइव माउंट किया जाता है तो स्क्रिप्ट कैसे चलाएं?


46

क्या कोई स्क्रिप्ट चलाने का एक तरीका है जब किसी विशेष यूएसबी डिवाइस को माउंट किया जाता है?

मैं अपने वीडियो को एक अलग USB पर रखता हूँ और एक स्क्रिप्ट चलाना चाहूँगा जो USB फ़ोल्डर पर वीडियो फ़ोल्डर को होम फ़ोल्डर में एक पर माउंट करे।

जवाबों:


31

अब systemd के साथ बहुत अच्छे समाधान है । आप एक सेवा बनाते हैं जो निर्भर करता है और आप मीडिया द्वारा चाहते हैं जैसे:/etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/home/you/bin/triggerScript.sh

[Install]
WantedBy=media-YourMediaLabel.mount

फिर आपको सेवा शुरू / सक्षम करनी होगी:
sudo systemctl start your.service
sudo systemctl enable your.service

माउंट के बाद, systemd आपकी ट्रिगर स्क्रिप्ट को फायर करता है। Udv नियम पर लाभ यह है कि स्क्रिप्ट वास्तव में माउंट के बाद फायर करती है, सिस्टम डिवाइस को जोड़ने के बाद नहीं।

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

संसाधन: udev के साथ स्क्रिप्टिंग

नोट: आप अपनी डिवाइस यूनिट को इसके साथ पा सकते हैं:systemctl list-units -t mount


मुझे उम्मीद है कि अप्रैल 2016 जल्द ही आएगा। अगले उबंटू LTS में सिस्टमड सक्षम होगा। AFAIK ऊपर से अच्छा समाधान Ubuntu 15.04 या नए की जरूरत है।
गुएतली

ओह, मैंने सोचा कि सिस्टमड पहले से ही उबंटू में है। मैं वास्तव में डेबियन खिंचाव ;-) चल रहा हूँ
sumid

@sumid अगर मैं इसे ~ / .config / systemd के तहत रखना चाहता हूं, तो क्या यह काम करेगा?
खुर्शीद आलम

4
महान! डेबियन जेसी में परीक्षण किया गया। अपनी सेवा को सक्षम करने के लिए मत भूलना systemctl enable your.service। स्क्रिप्ट फ़ाइल निष्पादन योग्य होनी चाहिए।
कॉर्नि

1
मेरे लिए, यह विफल है। जब मैं सेवा शुरू करने की कोशिश करता हूं, तो यह शिकायत करता है कि "यूनिट मीडिया- bb.mount नहीं मिला।" मैंने यह सुनिश्चित करने के लिए अपने अंगूठे की ड्राइव (FAT32) FS "bb" को बुलाया है कि इसमें कोई अजीब चरित्र नहीं हैं और यह बहुत लंबा या ऐसा कुछ भी नहीं है। मैंने कोशिश की Requires=, After=और, WantedBy=दोनों लाइनों के साथ media-bb.mountऔर media-BB.mountक्योंकि Nautilus मुझे "BB" के रूप में वॉल्यूम दिखाता है, न कि "bb"। एक ही त्रुटि संदेश, पूंजीकरण को छोड़कर। क्या गलत है? क्या मुझे किसी तरह उस media-<something>.mountसेवा को बनाना है ?
UTF-8

29

में अपने डिवाइस को खोजने के द्वारा शुरू करो lsusb। आईडी नोट करें (उदाहरण के लिए 0a81:0101)

नए udev रूल्स फ़ाइल को इसके /etc/udev/rules.d/माध्यम से बनाएँ sudoedit /etc/udev/rules.d/100-mount-videos.rulesऔर एक नए नियम को इस तरह से प्लैंक करें:

ACTION=="add", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0101", RUN+="/home/your_username/bin/mount_videos.sh"

ध्यान दें कि मैंने किस तरह से आईडी का उपयोग किया है lsusb

फिर आपको काम करने के लिए सिर्फ स्क्रिप्ट लिखने की जरूरत है। एक साधारण माउंट कमांड को काम करना चाहिए। sleep 5फ़ाइलसिस्टम को प्रारंभ करने के लिए प्रतीक्षा करने के लिए आपको एक आदेश की आवश्यकता हो सकती है (यदि आप मुख्य बढ़ते करने के लिए सूक्ति छोड़ देते हैं - लेकिन आप इसे पहले माउंट करने के लिए स्वतंत्र हैं और फिर आपको नींद की आवश्यकता नहीं हो सकती है)।

एलन से जुड़ाव: लंबे समय तक चलने वाली स्क्रिप्ट "इस या एक आश्रित डिवाइस के लिए सभी आगे की घटनाओं को रोक सकती है"। मेरा मिंट मैन पेज आगे बताता है, "लंबे समय से चल रहे कार्यों को तुरंत घटना प्रक्रिया से अलग करने की आवश्यकता है।" ऐसा करने के लिए कौशल हासिल करने के लिए कोई टिप नहीं दी जाती है।

ओली का जवाब: इसे इस तरह लपेटें: https://askubuntu.com/a/106359/449


4
मैं "र यू" कमांड को "सु your_user -c" के साथ उपसर्ग करने का सुझाव दे सकता हूं ताकि स्क्रिप्ट रूट विशेषाधिकारों के साथ नहीं चल रही हो।
कीस कुक

3
@Kees जैसा कि यहां उद्देश्य बढ़ रहा है, हालांकि रूट प्राइवेट रखना एक अच्छा विचार हो सकता है। शायद उपयोगकर्ता के घर में स्क्रिप्ट रखने के बजाय, आप इसे /root/या कहीं और रखते हैं जहां केवल रूट इसे संपादित कर सकता है।
ओली

2
इस सवाल का जवाब नहीं है। सवाल पूछता है कि जब यूएसबी ड्राइव माउंट किया जाता है तो स्क्रिप्ट कैसे चलाएं । यह उत्तर कहता है कि स्क्रिप्ट को कैसे चलाया जाए जो सम्मिलित होने पर USB ड्राइव को मापता है । अंतर मेरे लिए मायने रखता है क्योंकि मेरे पास ऐसी स्क्रिप्ट है (डिजिटल कैमरा के लिए); स्क्रिप्ट के बिना, ड्राइव प्रविष्टि पर (या उपयोगकर्ता सेटिंग्स के आधार पर) माउंट किया जा सकता है और यह केवल तब होता है जब ड्राइव माउंट किया जाता है कि मैं कुछ करना चाहता हूं (छवियों को कॉपी करें)। इसलिए मेरी स्क्रिप्ट (जो ड्राइव को जोड़ने पर चलती है) अक्सर गलत समय पर चलती है।
रेनियर पोस्ट


यह प्राप्त करने के लिए एक अविश्वसनीय रूप से विशिष्ट (भंगुर) तरीका है। आधुनिक distro के लिए और अधिक लागू @sumid जवाब का उपयोग systemd
MrMesees

8

ATTRS {idVendor} और ATTRS {idProduct} (उबंटू 12.04 में परीक्षण) के लिए मान प्राप्त करने का दूसरा तरीका है:

  1. पता लगाएं कि आपका usb कहां है:

    $ mount | grep /dev/sd*
    

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

    /dev/sdb on /media/SOMEDIR type vfat ...
    
  2. उस उपकरण की जानकारी प्राप्त करने के लिए udevadm का उपयोग करें:

    udevadm info -q all -n /dev/sdb | grep -E -i -w '.*VENDOR_ID.*|.*MODEL_ID.*'
    

    आउटपुट कुछ इस तरह होना चाहिए:

    E: ID_MODEL_ID=001a
    E: ID_VENDOR_ID=002b
    
  3. अब ATTRS {idProduct} के लिए मॉडल आईडी और ATTRS {idVendor} के लिए विक्रेता आईडी का उपयोग करें

    ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...
    

1

संपादित करें> वरीयताएँ> मीडिया के तहत Nautilus में आप "अन्य कार्रवाई" और "कॉस्ट्यूम कमांड" की तुलना में चुन सकते हैं। विभिन्न प्रकार के मीडिया के निष्पादन के लिए। उस समय तक USB ड्राइव पहले से ही माउंट है, लेकिन मुझे लगता है कि आप अभी भी इसे (एक कॉस्ट्यूम कमांड के साथ) उस फ़ोल्डर से लिंक कर सकते हैं, जिसे आप ड्राइव में दिखाना चाहते हैं। मैं नहीं बता सकता कि यह udev का उपयोग करने से आसान या बेहतर है।


आदेश एक पोशाक पहनता है? या एक पोशाक?
एरोज़लगो

1

यदि आप अपने डिवाइस पर बढ़ते हुए और अपने डिवाइस को नियंत्रित करने के लिए अपने फिल्ममेकर (नॉटिलस, कोनकेयर, गनोम, आदि) के साथ हस्तक्षेप नहीं करना चाहते हैं, तो मेरा सुझाव है कि udv रूट नहीं जा रहा है।

इसके बजाय, udisks-गोंद का उपयोग करें यदि आपका सिस्टम udisks का उपयोग करता है (लगभग सभी करते हैं)।

इंस्टॉल करने के बाद, बस ~/.udisks-glue.confइस तरह से अपने होम डायरेक्टरी में एक कॉन्फिगर फाइल बनाएं ।

मेरा निम्नलिखित उदाहरण मेरे कैमरे पर हर समय एसडी-कार्ड में प्लग-इन करने पर जीपीएस-असिस्ट डेटा को अपडेट करता है।

filter BT16EXTREME {
  optical = false
  partition_table = false
  usage = filesystem
  label = BT16EXTREME
}
match BT16EXTREME {
  post_mount_command = "/home/bernhard/update-gps-assist-data.pl %mount_point"
}

बाद में बस यह सुनिश्चित करें कि जब आप बूट या लॉग-इन करते हैं तो udisks-गोंद शुरू होता है। सूक्ति के स्टार्टअप अनुप्रयोगों के माध्यम से


1
Udev2 का समर्थन नहीं करता :-(
sumid


0

@ सुमिद के जवाब में समस्या है। आपको सेवा शुरू नहीं करनी चाहिए । आपको बस इसे सक्षम करने की आवश्यकता है।

फ़ाइल: /etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/any_path_even_inside_the_mount_point/script.sh

[Install]
WantedBy=media-YourMediaLabel.mount

फिर सेवा को सक्षम करें:

sudo systemctl enable your.service

बस इतना ही।

नोट: आप के साथ अपने औसत दर्जे का लेबल पा सकते हैं:sudo systemctl list-units -t mount

नोट 2: यदि सेवा किसी भी तरह से विफल है (उदाहरण के लिए, स्क्रिप्ट निष्पादन योग्य नहीं है), तो <old_mount_point_name>1अगली बार जब आप USB डिवाइस को माउंट करेंगे तो आपका आरोह बिंदु बदल जाएगा । इस समस्या को ठीक करने के लिए, आपको बस निष्पादित करने की आवश्यकता हैsudo systemctl reset-failed

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