मैं कैसे जांच सकता हूं कि क्या एक वॉल्यूम माउंट किया गया है जहां इसे पायथन का उपयोग करने वाला माना जाता है?


10

मुझे पायथन में एक बैकअप स्क्रिप्ट लिखी गई है जो स्रोत निर्देशिका को कॉपी करने से पहले गंतव्य निर्देशिका बनाता है। मैंने इसे /external-backupगंतव्य के रूप में उपयोग करने के लिए कॉन्फ़िगर किया है, जो कि मैं एक बाहरी हार्ड ड्राइव को माउंट करता हूं। मैंने केवल हार्ड ड्राइव को चालू किए बिना स्क्रिप्ट को चलाया (या माउंट किया जा रहा है) और पाया कि यह सामान्य के रूप में काम कर रहा था, यद्यपि आंतरिक हार्ड ड्राइव पर एक बैकअप बना रहा है, जिसमें खुद को बैकअप देने के लिए पर्याप्त जगह नहीं है।

मेरा प्रश्न है: मैं कैसे जांच सकता हूं कि क्या लिखने से पहले वॉल्यूम सही जगह पर रखा गया है? यदि मैं यह पता लगा सकता हूं कि /external-backupमाउंट नहीं किया गया है, तो मैं इसे लिखने से रोक सकता हूं।

बोनस प्रश्न यह अनुमति क्यों दी गई थी, जब ओएस जानता है कि निर्देशिका को किसी अन्य डिवाइस पर रहना चाहिए, और डेटा का क्या होगा (आंतरिक हार्ड ड्राइव पर) क्या मुझे बाद में उस डिवाइस (बाहरी हार्ड ड्राइव) को माउंट करना चाहिए? स्पष्ट रूप से एक ही पथ पर विभिन्न उपकरणों पर दो प्रतियां नहीं हो सकती हैं!

अग्रिम में धन्यवाद!

जवाबों:


23

मैं देख लेता os.path.ismount()


1
एकमात्र समस्या यह है कि यह एक बूलियन देता है और यह निर्दिष्ट नहीं करता है कि सही डिवाइस है या नहीं।
मैकजेफ

3
@MJJff: यह सच है कि यह नहीं बताता है कि यह बताता है कि क्या । यदि कोई उपकरण नहीं है, तो वह गलत वापस आ जाएगा और उस पथ पर एक लेख मूल फाइल सिस्टम में अंतर्निहित निर्देशिका को लिख देगा । इसलिए यदि यह गलत है, तो एक त्रुटि जारी करें और वहां न लिखें। निर्देशिका /external-backupबाहरी डिवाइस पर नहीं रहती है, यह मूल फ़ाइल सिस्टम पर रहती है। सिस्टम केवल mountयह जानता है कि वह क्या बताता है, इसका कोई विचार नहीं है कि वहां क्या होना चाहिए । यूनिक्स फाइल सिस्टम पर "माउंट पॉइंट" के बारे में कुछ खास नहीं है। यह सिर्फ एक नियमित निर्देशिका है।
अगली सूचना तक रोक दिया गया।

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

अच्छे खर्च!
मैकजेफ

5

कुछ के लिए एक निश्चित जवाब के लिए केवल कर्नेल सुनिश्चित करने के लिए जानता है, कर्नेल से पूछें:

cat /proc/mounts

उस फ़ाइल को पढ़ा जा सकता है / पार्स किया जा सकता है जैसे कि यह एक सामान्य फ़ाइल थी, जो आपके किसी भी उपकरण का उपयोग करके। जिसमें पायथन भी शामिल हैं। त्वरित-एन-गंदा उदाहरण:

#!/usr/bin/python

d = {}

for l in file('/proc/mounts'):
    if l[0] == '/':
        l = l.split()
        d[l[0]] = l[1]

import pprint

pprint.pprint(d)

4

जांच करने का सबसे आसान तरीका यह है कि इसके mountमाध्यम से आह्वान करें subprocessऔर देखें कि यह वहां दिखाई देता है या नहीं। अतिरिक्त क्रेडिट के लिए, यह पता लगाने os.readlink()की सामग्री पर उपयोग करें कि /dev/disk/by-*यह कौन सा डिवाइस है।


जैसा कि मैंने इसे उस दृष्टिकोण के साथ समस्या के रूप में देखा है कि इसका उत्पादन mountसबसे अच्छा रूप से परिभाषित है। mountअगर मैं पर चढ़ /dev/evil device on tourगया हूँ तो आउटपुट क्या करता है /directory on which I mount devices? आउटपुट की पार्सिंग ऐसे मामलों में अविश्वसनीय हो सकती है ...
स्काईकिंग

2

बोनस का जवाब। यदि बाहरी डिवाइस माउंट नहीं है, तो पथ में रूट विभाजन को डेटा लिखा जाता है /external-backup। यदि बाहरी डिवाइस रूट विभाजन पर डेटा माउंट किया गया है, लेकिन यह उपलब्ध नहीं है, क्योंकि /external-backupअब बाहरी डिवाइस को इंगित कर रहा है।


2

पुराना सवाल है, लेकिन मुझे लगा कि मैं अपने समाधान ( डेनिस विलियमसन और इग्नासियो वाज़केज़-अब्राम्स के जवाब पर) किसी भी तरह से योगदान दूंगा । चूँकि मैं दूरस्थ निर्देशिकाओं को माउंट करने के लिए गैर-लिनक्स वातावरण पर इसका उपयोग कर रहा हूं, इसलिए / proc और mtab का उपयोग नहीं किया जा सकता है और कोई अतिरिक्त चेक लागू नहीं किया गया है:

def is_mounted(special, directory):
    search_prefix = '{} on {}'.format(special, directory.rstrip('/'))

    if os.path.ismount(directory):
        mounts = subprocess.check_output(['mount']).split('\n')

        for line in mounts:
            if line[:len(search_prefix)] == search_prefix:
                return True;

    return False

सुधार का स्वागत है!


1

/ Etc / mtab फ़ाइल आपको यह बताने के लिए मौजूद है कि वर्तमान में क्या माउंट है। एक getmntentकॉल है, लेकिन मुझे नहीं लगता कि यह osमॉड्यूल में निर्यात किया गया है। जल्दी और गंदा? खुला / आदि / mtab और विभाजन। सुनिश्चित करें कि आपका उपकरण कॉलम 0 में मौजूद है और कॉलम 1 में गंतव्य माउंट बिंदु सही है।

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