जाँच करें कि निर्देशिका बैश के साथ घुड़सवार है या नहीं


94

मै इस्तेमाल कर रहा हूँ

mount -o bind /some/directory/here /foo/bar

मैं /foo/barबैश स्क्रिप्ट के साथ जांच करना चाहता हूं , और देखें कि क्या इसकी माउंटिंग की गई है? यदि नहीं, तो उपरोक्त माउंट कमांड को कॉल करें, अन्यथा कुछ और करें। मैं यह कैसे कर सकता हूँ?

CentOS ऑपरेटिंग सिस्टम है।


कुछ ऐसा है जैसे "अगर [[$ (
आरएल

जवाबों:


69

mountतर्कों के बिना कमांड चलाना आपको वर्तमान माउंट्स बताएगा। शेल स्क्रिप्ट से, आप आरोह बिंदु के साथ grepऔर एक if-statement देख सकते हैं:

if mount | grep /mnt/md0 > /dev/null; then
    echo "yay"
else
    echo "nay"
fi

मेरे उदाहरण में, अगर-स्टेटमेंट बाहर निकलने के कोड की जांच कर रहा है grep, जो इंगित करता है कि क्या कोई मैच था। चूंकि मैं नहीं चाहता कि जब कोई मैच हो, तो आउटपुट प्रदर्शित हो, मैं इसे रीडायरेक्ट कर रहा हूं /dev/null


4
आपको यह जाँचने की आवश्यकता नहीं है कि क्या यह एक स्ट्रिंग लौटाता है। grepयदि कोई मैच नहीं है तो एक गैर-शून्य निकास स्थिति लौटाता है। परीक्षण की आवश्यकता नहीं है, या $ () द्वारा बनाई गई उपधारा है। if command | grep -q 'stuff'; then ...
जोर्डन

32
यह माउंट बाइंड के साथ काम नहीं करता है और इसलिए उत्तर के रूप में स्वीकार नहीं किया जाना चाहिए। इस जवाब को वोट देना चाहिए। आप यह mount | grep ...दिखाने पर निर्भर नहीं कर सकते कि आपका माउंट बाइंड अभी भी सक्रिय है। यदि अंतर्निहित डिवाइस अनमाउंट और रिमाउंट किया गया है, तो माउंट बाइंड वास्तव में दो फ़ाइलों / निर्देशिकाओं को कनेक्ट नहीं करेगा भले ही mountयह अभी भी जुड़ा हुआ है। और अगर आप ऐसा करते हैं, तो umount ...यह भी बताएगा कि यह मुहिम नहीं है, हालांकि mountयह कहा गया था। लिनक्स फाइल सिस्टम में बड़ी खराबी।
देव नल

@DevNull: आपके द्वारा बताए गए मुद्दे के बारे में मैं बता रहा हूं। इस समस्या का कोई समाधान?
इसहाक

@ इस्साक, जवाब में देरी के लिए खेद है। मैं प्रयोग करने की कोशिश करूंगा readlink -f, जो पथ / फ़ाइल मौजूद नहीं होने पर कुछ भी नहीं लौटाता है। यदि अंतर्निहित / माउंट / पथ / to_file नहीं है (प्रति रीडिंकल), तो अंतर्निहित माउंट टूट गया है (अंतर्निहित माउंट और बाइंडिंग को रिमाउंट करें)। यदि अंतर्निहित फ़ाइल वहाँ है और readlink -fकहती है कि उस फ़ाइल का बाइंडिंग-वर्ज़न नहीं है, तो बंधन टूट गया है, बस बाइंडिंग को रिमाउंट करें।
देव नल

2
अगर कोई माउंट कहा जाता है, /mnt/md0xxxतो कमांड /mnt/md0इसे माउंट होने के रूप में इंगित करेगा, जबकि यह नहीं होना चाहिए ...
डेविड एल।

179

आपने O / S का उल्लेख करने की जहमत नहीं उठाई।

उबंटू लिनक्स 11.10 (और शायद लिनक्स के सबसे अद्यतित स्वाद) के पास mountpointकमांड है।

यहाँ मेरे एक सर्वर पर एक उदाहरण दिया गया है:

$ mountpoint /oracle
/oracle is a mountpoint
$ mountpoint /bin
/bin is not a mountpoint

वास्तव में, आपके मामले में, आपको -qविकल्प का उपयोग करने में सक्षम होना चाहिए , जैसे:

mountpoint -q /foo/bar || mount -o bind /some/directory/here /foo/bar

उम्मीद है की वो मदद करदे।


7
आपके पास 'माउंटपॉइंट' कमांड चलाने के समय वास्तव में आपके पास कुछ है? यहां तक ​​कि अगर यह एक माउंटपॉइंट होने का इरादा है, जब तक कि यह वास्तव में कुछ घुड़सवार न हो, यह सिर्फ एक निर्देशिका है।
मार्क जे। बोबाक

2
+1, उबंटू 10.10 पर भी काम करता है। यह 8.04 से उबंटू में है
l0b0


2
माउंटपॉइंट मौजूद है और डेबियन 7 ("व्हीजी") और यूसीएस 4 पर पूरी तरह से काम करता है,
लाह्मिज़ार

7
जैसा कि एक अन्य टिप्पणी में उल्लेख किया गया है कि माउंटपॉइंट बाइंड माउंट्स के साथ काम नहीं करता है। स्निपेट कई बार dir को माउंट करेगा
csanchez

41

मैनुअल का mountpointकहना है कि यह:

जाँच करता है कि दी गई निर्देशिका या फ़ाइल / proc / self / mountinfo फ़ाइल में उल्लिखित है या नहीं।

मैनुअल का mountकहना है कि:

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

तो उपयोग करने के लिए सही कमांड हैfindmnt , जो स्वयं util-linuxपैकेज का हिस्सा है और मैनुअल के अनुसार:

/ etc / fstab, / etc / mtab या / proc / self / mountinfo में खोज करने में सक्षम है

इसलिए यह वास्तव में की तुलना में अधिक चीजों को खोजता है mountpoint। यह सुविधाजनक विकल्प भी प्रदान करता है:

-एम, --माउंटपॉइंट पाथ

स्पष्ट रूप से माउंटपॉइंट फ़ाइल या निर्देशिका को परिभाषित करें। यह भी देखें --target

सारांश में, यह जाँचने के लिए कि क्या निर्देशिका को बैश के साथ रखा गया है, आप इसका उपयोग कर सकते हैं:

if [[ $(findmnt -M "$FOLDER") ]]; then
    echo "Mounted"
else
    echo "Not mounted"
fi

उदाहरण:

mkdir -p /tmp/foo/{a,b}
cd /tmp/foo

sudo mount -o bind a b
touch a/file
ls b/ # should show file
rm -f b/file
ls a/ # should show nothing

[[ $(findmnt -M b) ]] && echo "Mounted"
sudo umount b
[[ $(findmnt -M b) ]] || echo "Unmounted"

2

मुझे ऐसे उत्तर पसंद हैं जो उपयोग करते हैं /proc/mounts, लेकिन मुझे एक साधारण grep करना पसंद नहीं है। जो आपको झूठी सकारात्मकता दे सकता है। जो आप वास्तव में जानना चाहते हैं वह है "फ़ील्ड नंबर 2 के लिए किसी भी पंक्ति में यह सटीक स्ट्रिंग है"। तो, यह सवाल पूछें। (इस मामले में मैं जाँच कर रहा हूँ /opt)

awk -v status=1 '$2 == "/opt" {status=0} END {exit status}' /proc/mounts

# and you can use it in and if like so:

if awk -v status=1 '$2 == "/opt" {status=0} END {exit status}' /proc/mounts; then
  echo "yes"
else
  echo "no"
fi

1
ये बहुत प्यारी है! संक्षेप में, आप एक छोटे से एम्बेडेड सिस्टम के लिए क्या चाहते हैं जहां कोई आकर्षक उपकरण जैसे mountpointया findmntमौजूद नहीं है। बहुत सरल उत्तर, बहुत खुशी, इस तरह के UNIX :)
troglobit

1

मेरा समाधान:

is_mount() {
    path=$(readlink -f $1)
    grep -q "$path" /proc/mounts
}

उदाहरण:

is_mount /path/to/var/run/mydir/ || mount --bind /var/run/mydir/ /path/to/var/run/mydir/

के लिए मार्क जे Bobak का जवाब , mountpointअगर साथ माउंट काम नहीं bindअलग फाइल सिस्टम में विकल्प।

के लिए क्रिस्टोफर Neylan का जवाब यह रीडायरेक्ट ग्रेप का उत्पादन करने की जरूरत नहीं है / dev / बातिल, बस का उपयोग करने के grep -qबजाय।

सबसे महत्वपूर्ण, का उपयोग करके पथ canonicalizereadlink -f $mypath :

  • यदि आप /path/to/dir/बैकस्लैश के साथ अंत जैसे पथ की जांच करते हैं , तो पथ /proc/mountsया mountआउटपुट है/path/to/dir
  • सबसे linux विज्ञप्ति में, /var/run/की सिमलिंक है /run/, इसलिए यदि आप के लिए बाँध माउंट /var/run/mypathऔर अगर यह घुड़सवार, यह रूप में प्रदर्शित करेगा जाँच /run/mypathमें /proc/mounts

2
मुझे लगता है कि "grep -q" $ path "/ proc / mounts" (स्थान के साथ) और भी बेहतर है ... नहीं तो is_mount ab तभी वापस लौटेगा जब abc आरोहित होता है ?!
अल्फोंक्स

0

एक और साफ समाधान इस तरह है:

$ mount | grep /dev/sdb1 > /dev/null && echo mounted || echo unmounted

निश्चित रूप से, प्रत्येक मामले के लिए आपको जो कुछ भी करने की आवश्यकता होती है, उसके द्वारा 'प्रतिध्वनित कुछ' प्रतिस्थापित किया जा सकता है।


यह ठीक वैसा ही काम कर रहा है, जैसा @ क्रिस्टोफरनेनलन का जवाब है।
जोनाथन एच।

0

यहाँ उत्तर बहुत जटिल हैं बस जाँच करें कि क्या माउंट मौजूद है:

cat /proc/mounts | tail -n 1

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


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