अगर बैश स्क्रिप्ट में वॉल्यूम माउंट किया गया है, तो यह जांचने का सबसे अच्छा तरीका क्या है?


103

अगर बैश स्क्रिप्ट में वॉल्यूम माउंट किया गया है, तो यह जांचने का सबसे अच्छा तरीका क्या है?

मैं वास्तव में क्या पसंद करूंगा जो एक ऐसी विधि है जिसका मैं इस तरह उपयोग कर सकता हूं:

if <something is mounted at /mnt/foo> 
then
   <Do some stuff>
else
   <Do some different stuff>
fi

मैं खुद ऐसा करने के लिए एक स्क्रिप्ट लिखने वाला था। मेरा पहला विचार / etc / mtab से जानकारी प्राप्त करना है, लेकिन मैंने अपनी बैश पुस्तकों के माध्यम से अभी तक अंगूठे को नहीं देखा है, यह देखने के लिए कि क्या कोई अधिक प्रत्यक्ष तरीका है।
3dinfluence

@ 3dinfluence - हाँ मुझे यह बहुत पहले से पता है, लेकिन /etc/mtab, इससे /proc/mountsजुड़े हुए हैं /proc/self/mounts(कम से कम फेडोरा 20 पर यह है)
विल्फ

जवाबों:


113

उपयोग करने से बचें /etc/mtabक्योंकि यह असंगत हो सकता है।

पाइपिंग से बचें mountक्योंकि यह जटिल नहीं है।

सीधे शब्दों में:

if grep -qs '/mnt/foo ' /proc/mounts; then
    echo "It's mounted."
else
    echo "It's not mounted."
fi

( /mnt/fooउदाहरण के बाद अंतरिक्ष मिलान से बचने के लिए है /mnt/foo-bar।)


7
उल्लेख करने के लिए नहीं, यदि माउंटपॉइंट wedged है तो माउंट करने के लिए कॉल लटका सकती है।
चाड हन्नेयकट

8
Linux के लिए अच्छा है, freebsd या Solaris के लिए नहीं।
क्रिस

4
यह सच है, क्रिस। हालांकि प्रश्न को लिनक्स को टैग किया गया था।
डैन कार्ली

3
मुझे लगता है कि यह एक दार्शनिक सवाल है - क्या हमें संभव हो तो चीजों को पोर्टेबल बनाने का प्रयास करना चाहिए या क्या हमें यह मान लेना चाहिए कि दुनिया की सभी चलने वाली खिड़कियां / लिनक्स और तदनुसार कार्य करते हैं?
क्रिस

18
दरअसल, आपको / / mnt / foo ’के लिए परीक्षण करना चाहिए, अर्थात। एक स्थान के साथ या आप एक गलत सकारात्मक प्राप्त कर सकते हैं यदि आपने उदाहरण के लिए एक वॉल्यूम माउंट किया है। 'fooks'। मुझे सिर्फ दो माउंट पॉइंट्स, 'lmde' और 'lmde-home' के साथ वह मुद्दा मिला।
marlar

58
if mountpoint -q /mnt/foo 
then
   echo "mounted"
else
   echo "not mounted"
fi

या

mountpoint -q /mnt/foo && echo "mounted" || echo "not mounted"

4
बस जानकारी के लिए: mountpointउबंटू / डेबियन में "इनसाइटस्क्रिप्स" पैकेज से उत्पन्न होता है।
blueyed

1
मेरे लिए काम नहीं किया -:
विलफ

यही वह पुकार है, जिससे मेरा वैग्रांट लटका हुआ है।
ढिल्ले

इसके साथ समस्या mountpointयह है कि यह जांचता है, वास्तव में, यदि एक माउंट पॉइंट माउंट किया गया है, लेकिन अगर डिवाइस माउंट नहीं है। यदि किसी उपकरण को -xविकल्प के साथ पास किया जाता है, तो यह आपको प्रमुख / लघु डिवाइस नंबर बताता है, लेकिन यदि यह माउंट नहीं है।
वेजीट्रिपी

@ डेब्यू बर्ड इन डेबियन बस्टर यह पैकेज द्वारा प्रदान किया गया हैutil-linux
एल्बाउलांगेरो

18

findmnt -rno SOURCE,TARGET "$1"अन्य उत्तरों में सभी समस्याओं से बचा जाता है। यह केवल एक कमांड के साथ सफाई से काम करता है।


अन्य दृष्टिकोणों में ये गिरावट है:

  • grep -qऔर grep -sएक अतिरिक्त अनावश्यक कदम हैं और हर जगह समर्थित नहीं हैं।
  • /proc/\* हर जगह समर्थित नहीं है।
  • mountinfo / proc / पर आधारित है।
  • cut -f3 -d' ' पथ नामों में रिक्त स्थान को गड़बड़ करता है
  • पार्सिंग माउंट की सफेद जगह समस्याग्रस्त है। यह मैन पेज अब कहता है:

.. लिस्टिंग मोड केवल पिछड़े संगतता के लिए बनाए रखा है।

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


बैश कार्य:

#These functions return exit codes: 0 = found, 1 = not found

isMounted    () { findmnt -rno SOURCE,TARGET "$1" >/dev/null;} #path or device
isDevMounted () { findmnt -rno SOURCE        "$1" >/dev/null;} #device only
isPathMounted() { findmnt -rno        TARGET "$1" >/dev/null;} #path   only

#where: -r = --raw, -n = --noheadings, -o = --output

उपयोग के उदाहरण:

if isPathMounted "/mnt/foo bar";      #Spaces in path names are ok.
   then echo "path is mounted"
   else echo "path is not mounted"
fi

if isDevMounted "/dev/sdb4"; 
   then echo "device is mounted"
   else echo "device is not mounted"
fi

#Universal:
if isMounted "/mnt/foo bar"; 
   then echo "device is mounted"
   else echo "device is not mounted"
fi

if isMounted "/dev/sdb4";
   then echo "device is mounted"
   else echo "device is not mounted"
fi

1
वैसे भी लिनक्स के लिए यह वास्तव में सबसे अच्छा तरीका है। मैंने findmnt(8)कमांड देखा है, लेकिन मैं वास्तव में इसके साथ कभी नहीं खेला। सच कहूँ तो अगर मुझे अपनी कुछ स्क्रिप्ट्स को अपडेट करना था जो इस प्रकार की चीज़ (या नए को बनाते हैं) एक लिनक्स बॉक्स पर (या जहाँ कमांड उपलब्ध है) यह वही है जो मैं करूँगा।
प्रिएफ्टन

1
ध्यान दें कि एनकोफ़्स के लिए, findmntपैरामीटर के साथ आपूर्ति की जानी चाहिए --source encfs, अन्यथा यह हमेशा निर्देशिका को माउंट करने पर विचार करेगा क्योंकि यह मूल माउंट पर वापस आ जाता है।
बर्कर्ट

यह grepसमाधान से भी बेहतर है क्योंकि यदि एक माउंट पथ अजीब है, तो आप गलत सकारात्मक प्राप्त कर सकते हैं: जैसे कि यदि मैं माउंट /dev/mmcblk0p1करता ~/mnt/dev/sda1हूं, तो मैं गलत तरीके /dev/sda1से कमांड द्वारा माउंट की गई बात कर सकता हूं mount | grep '/dev/sda1'। मैं गलत सकारात्मक उपयोग नहीं कर सकता findmnt। अच्छा उत्तर!
Cody Piersall

7

इस तरह की स्क्रिप्ट कभी पोर्टेबल नहीं होती है। यूनिक्स में एक गंदा रहस्य यह है कि केवल कर्नेल को पता है कि फाइलसिस्टम कहां हैं, और चीजों की कमी / खरीद (पोर्टेबल नहीं) जैसे कि यह आपको कभी भी सीधे जवाब नहीं देगा।

मैं आमतौर पर df का उपयोग यह जानने के लिए करता हूं कि एक उपनिर्देशिका का माउंट-पॉइंट क्या है और यह किस फाइलसिस्टम में है।

उदाहरण के लिए (राख / AT & T ksh / bash / etc जैसे पॉज़िक्स शेल की आवश्यकता होती है)

case $(df  $mount)
in
  $(df  /)) echo $mount is not mounted ;;
  *) echo $mount has a non-root filesystem mounted on it ;;
esac

Kinda आपको उपयोगी जानकारी बताता है।


1
प्रश्न को लिनक्स को टैग किया गया है, इसलिए हो सकता है कि यह पोर्टेबल न हो
Rory

6

निम्नलिखित मैं अपने rsync बैकअप क्रॉन-जॉब्स में से एक में क्या उपयोग करता हूं। यह देखने के लिए जाँच करता है कि क्या / बैकअप माउंट किया गया है, और इसे माउंट करने की कोशिश करता है अगर यह नहीं है (यह विफल हो सकता है क्योंकि ड्राइव एक गर्म-स्वैप बे में है और सिस्टम में मौजूद भी नहीं हो सकता है)

नोट: निम्न केवल linux पर काम करता है, क्योंकि यह greps / proc / mounts - एक अधिक पोर्टेबल संस्करण माउंट करेगा। grep / backup ', मैथ्यू के जवाब के रूप में ..

  अगर ! grep -q / backup / proc / mounts; फिर
    अगर ! माउंट / बैकअप; फिर
      गूंज "विफल"
      बाहर निकलें 1
    फाई
  फाई
  गूंज "आगे बढ़ी।"
  # यहां सामान रखें

2
एक अच्छा विवेक जाँच विकल्प के रूप में प्रस्तुत किया गया।
डैन कार्ली

संभवतः यह पद्धति मैथ्यू बलोच के उत्तर जैसी ही समस्याओं में चलती है।
mwfearnley

हाँ, "एलिप्टिकल व्यू" द्वारा उल्लिखित स्पेस-इन-फ़ाइलनाम मुद्दे को छोड़कर (यह पूरी लाइन को greps करता है, न कि केवल एक निकाला गया फ़ील्ड)। उप-स्ट्रिंग समस्या एक बड़ी बात नहीं है जब तक कि आप किसी तरह से यह नहीं भूल जाते कि तर्कों को उद्धृत करना एक ऐसी चीज है जो आप कर सकते हैं। जैसे grep -q ' /backup ' /proc/mountsया mount | grep -q ' /backup '। या / dev / बातिल को अनुप्रेषित अगर आपके ग्रेप का समर्थन नहीं करता -qहै (जो है ग्रेप इन दिनों के लिए POSIX कल्पना में)।
कास

2

चूंकि माउंट करने के लिए, आपको वैसे भी एक निर्देशिका की आवश्यकता होती है, जो कि ऊपर चढ़ जाती है, मेरी रणनीति हमेशा एक अजीब फ़ाइलनाम के साथ एक फर्जी फ़ाइल बनाने की थी, जिसका उपयोग कभी नहीं किया जाएगा, और बस इसके अस्तित्व की जांच करें। यदि फ़ाइल वहाँ थी, तो उस स्थान पर कुछ भी नहीं लगाया गया था ...

मुझे नहीं लगता कि यह बढ़ते नेटवर्क ड्राइव या उस तरह की चीजों के लिए काम करता है। मैंने इसका उपयोग फ्लैश ड्राइव के लिए किया था।


2

उपकरणों की संख्या की तुलना के बारे में कैसे? मैं सिर्फ सबसे गूढ़ तरीके से सोचने की कोशिश कर रहा था ।

#!/bin/bash
if [[ $(stat -c "%d" /mnt) -ne $(stat -c "%d" /mnt/foo) ]]; then
    echo "Somethin mounted there I reckon"
fi

इसके साथ मेरे तर्क में एक दोष है ...

एक समारोह के रूप में:

#!/usr/bin/bash
function somethingMounted {
        mountpoint="$1"
        if ! device1=$(stat -c "%d" $mountpoint); then
                echo "Error on stat of mount point, maybe file doesn't exist?" 1>&2
                return 1
        fi
        if ! device2=$(stat -c "%d" $mountpoint/..); then
                echo "Error on stat one level up from mount point, maybe file doesn't exist?" 1>&2
                return 1
        fi

        if [[ $device1 -ne $device2 ]]; then
                #echo "Somethin mounted there I reckon"
                return 0
        else
                #echo "Nothin mounted it seems"
                return 1
        fi
}

if somethingMounted /tmp; then
        echo "Yup"
fi

इको एरर मैसेज शायद बेमानी हैं, क्योंकि स्टेट एक एरर को भी प्रदर्शित करेगा।


वास्तव में, शायद यह सुनिश्चित करने के लिए प्रत्येक कॉल के लिए पहले स्टेट की निकास स्थिति की जांच करनी होगी कि फ़ाइल वहाँ है ... जैसा कि मैंने सोचा था कि उपन्यास नहीं है :-(
काइल ब्रान्ड

1

इनमें से कोई भी उपयोग के मामले को संतुष्ट नहीं करता है जहां दी गई निर्देशिका किसी अन्य माउंट बिंदु के भीतर एक उप निर्देशिका है। उदाहरण के लिए, आपके पास / चीज़ हो सकती है जो होस्ट करने के लिए NFS माउंट है: / real_thing। इस उद्देश्य के लिए grep का उपयोग / proc / mounts / etc / mtab या 'माउंट' पर काम नहीं करेगा, क्योंकि आप एक ऐसे माउंट बिंदु की तलाश करेंगे जो मौजूद नहीं है। उदाहरण के लिए, / चीज़ / चीज़ माउंट बिंदु नहीं है, लेकिन / चीज़ होस्ट पर मुहिम की जाती है: / real_thing। यहाँ पर मतदान किया गया सबसे अच्छा उत्तर वास्तव में "यह निर्धारित करने का सबसे अच्छा तरीका नहीं है कि क्या कोई निर्देशिका / वॉल्यूमेन आरोहित है"। मैं एक क्लीनर रणनीति के रूप में 'df -P' (-पीओएसआईएक्स मानक मोड) का उपयोग करते हुए वोट करूंगा:

dev=`df -P /thing/thingy | awk 'BEGIN {e=1} $NF ~ /^\/.+/ { e=0 ; print $1 ; exit } END { exit e }'` && {
    echo "Mounted via: $dev"
} || {
    echo "Not mounted"
}

इसे चलाने से आउटपुट होगा:

Mounted via: host:/real_thing

यदि आप जानना चाहते हैं कि वास्तविक आरोह बिंदु क्या है, तो कोई समस्या नहीं:

mp=`df -P /thing/thingy | awk 'BEGIN {e=1} $NF ~ /^\/.+/ { e=0 ; print $NF ; exit } END { exit e }'` && {
    echo "Mounted on: $mp"
} || {
    echo "Not mounted"
}

उस कमांड से आउटपुट होगा:

Mounted on: /thing

यह सब बहुत उपयोगी है अगर आप कुछ मनमाना निर्देशिका या फ़ाइल सूची के माध्यम से चेरोट के बाहर अंक माउंट करने वाले दर्पण के कुछ प्रकार बनाने की कोशिश कर रहे हैं।


1

इसे लाने के लिए क्षमा करें, लेकिन मुझे लगता है कि यह बहुत उपयोगी है:

if awk '{print $2}' /proc/mounts | grep -qs "^/backup$"; then
    echo "It's mounted."
else
    echo "It's not mounted."
fi

इसे / proc / mounts (2nd column = Mount points) का दूसरा कॉलम मिलता है।

फिर यह आउटपुट को पकड़ लेता है। ^ और $ पर ध्यान दें, यह मेल / मेल / बैकअप या / बैकअप-पुराने आदि से रोकता है।


0

आपके आरोह बिंदु के लिए grep / etc / mtab?


1
mtab तारीख से बाहर निकल सकते हैं या बस माउंट द्वारा अपडेट नहीं किए जा सकते हैं, जैसे कि जब आप माउंट-एन का उपयोग करते हैं क्योंकि / केवल पढ़ने के लिए होता है।
चिश

मैं सहमत हूँ, लेकिन यह पहली जगह की तरह लग रहा था।
Ophidian


0

हालांकि यह एक लिनक्स प्रश्न है, जब इसे आसानी से किया जाता है तो इसे पोर्टेबल क्यों नहीं बनाया जाता है?

का मैनुअल पृष्ठ grepकहता है:

पोर्टेबल शेल स्क्रिप्ट को -q और -s दोनों से बचना चाहिए और /dev/nullइसके बजाय मानक और त्रुटि आउटपुट को रीडायरेक्ट करना चाहिए ।

इसलिए मैं निम्नलिखित समाधान प्रस्तावित करता हूं:

if grep /mnt/foo /proc/mounts > /dev/null 2>&1; then
        echo "Mounted"
else
        echo "NOT mounted"
fi

3
कई यूनिक्स प्रणालियों / proc फाइल सिस्टम प्रदान नहीं करते हैं
दमित्री Chubarov

@DmitriChubarov वास्तव में। पोर्टेबिलिटी की अवधारणा को विडंबना यह नहीं बनाती है? और शायद यह एक और अधिक हाल ही में अद्यतन है, लेकिन -qऔर -sPOSIX द्वारा निर्दिष्ट कर रहे हैं ताकि वहाँ इसके साथ किसी भी पोर्टेबिलिटी मुद्दा वैसे भी नहीं होना चाहिए (अब से पहले नहीं तो - मैं क्या परिवर्तन हो सकता है जब पर नज़र रखी नहीं है)।
प्रिएफ्टन

0

क्या इसे इससे अधिक जटिल होने की आवश्यकता है?

mount \
    | cut -f 3 -d ' ' \
    | grep -q /mnt/foo \
  && echo "mounted" || echo "not mounted"

1
grep -q /mnt/fooभी माउंट अंक /mnt/foodऔर मैच होगा /not/mnt/foo... कैसे के बारे में grep -qx /mnt/foo?
राकसलिस

@ काम: वह काम नहीं करेगा। -xgrep मैच तभी बनाता है जब पूरी लाइन मेल खाती हो।
१k

1
cut -f 3 -d ' 'जब माउंट पथ एक फ़ाइल नाम में एक स्थान है ठोकर।
अण्डाकार दृश्य

0

निर्भर करता है कि आप उस वॉल्यूम के बारे में जानते हैं जिसकी आप जाँच कर रहे हैं।

हाल ही में मैंने जिस विशेष मामले में शोध किया था, जहां मैं यह जानने के लिए चिंतित था कि क्या कोई विशेष फ्लैश ड्राइव मुहिम शुरू की गई थी, जो सबसे आसानी से काम करता है / देव / डिस्क / बाय-लेबल / के अस्तित्व के लिए जाँच कर रहा है। यदि डिवाइस को प्लग इन किया गया है, तो udev स्क्रिप्ट यह सुनिश्चित करती है कि लिंक मौजूद है (और डिवाइस के अनप्लग होने पर इसे हटा दिया जाता है)।

(यह एक अत्यधिक पोर्टेबल उत्तर नहीं है; यह कई आधुनिक लिनक्स वितरणों पर काम करता है, हालांकि, और प्रश्न लिनक्स के लिए टैग किया गया था, और यह अभी तक उल्लिखित किसी भी चीज़ से पूरी तरह से अलग दृष्टिकोण है, इसलिए यह संभावनाओं का विस्तार करता है।)


0

अपने माउंटपॉइंट के तहत फ़ाइल बनाएं जैसे कि check_mountऔर फिर परीक्षण करें कि क्या यह मौजूद है?

if [[ -f /something/check_mount ]]; then
   echo "Mounted
   RC=$?
else
   Echo "Not mounted"
   RC=0
fi
exit $RC

-1

मुझे यह बात शेफ में बेवकूफी के लिए करनी पड़ी जब से शेफ-क्लाइंट चलेगा, वॉल्यूम पहले से माउंट होने के कारण फेल हो जाएगा। जब मैं इसे लिखता हूं, तो शेफ mountसंसाधन में कुछ प्रकार के बग होते हैं जो उन विशेषताओं के साथ काम नहीं करेंगे जिनकी मुझे ज़रूरत थी, इसलिए मैंने executeसंसाधन का उपयोग करके वॉल्यूम को माउंट किया । यहाँ है कि मैं यह कैसे किया:

if not node['docker-server']['mountpoint'] == "none"
  execute "set up mount" do
    user "root"
    command "mount -t ext4 #{node['docker-server']['mountpoint']} #{node['docker-server']['data-dir']}"
    not_if "grep -qs #{node['docker-server']['data-dir']} /proc/mounts"
  end
end

किसी भी भ्रम की स्थिति में, मेरी विशेषता फ़ाइल में, मेरे पास निम्नलिखित हैं:

default['docker-server']['mountpoint'] = "/dev/vdc"
default['docker-server']['data-dir'] = "/data"

if not node['docker-server']['mountpoint'] == "none"एक का एक हिस्सा है caseबयान करता है, तो सर्वर पर माउंट बात करने के लिए निर्दिष्ट नहीं है जहां, माउंट बिंदु चूक none


... और इसका मूल प्रश्न से क्या लेना-देना है?
मैसिमो

मूल प्रश्न के लिए मेरी बावर्ची नुस्खा का संबंध यह है कि लोग तेजी से स्वचालन की ओर बढ़ रहे हैं। इसलिए, अगर कोई यहां आकर सोचता है कि शेफ की रेसिपी में यह काम कैसे किया जाए, तो उनका जवाब होगा। जीवन में दो विकल्प हैं: 1) नंगे न्यूनतम करें और कुछ लोगों को खुश करें, और 2) अतिरिक्त मील जाएं। इसलिए, मेरे पोस्ट को नीचे चिह्नित करने के बजाय, इसे स्वीकार करें कि यह क्या है: अतिरिक्त जानकारी जो स्वीकृत उत्तर का समर्थन करती है।
केलॉ

सवाल बैश स्क्रिप्ट के बारे में था, आपका जवाब शेफ स्क्रिप्टिंग के बारे में है। हालांकि यह संभवतः किसी के लिए उपयोगी हो सकता है, फिर भी यह प्रश्न की प्रासंगिकता को सहन नहीं करता है।
मैसिमो

@KLaw 'इसलिए, मेरे पोस्ट को नीचे चिह्नित करने के बजाय, इसे स्वीकार करें कि यह क्या है: अतिरिक्त जानकारी जो स्वीकृत उत्तर का समर्थन करती है।' मैं सहमत हूं और मैं आमतौर पर वोट डाउन नहीं करता हूं (और मैं यहां या तो नहीं हूं) लेकिन अगर आपके पास उस प्रकार की समस्या है, तो शायद आपको इसे अपने अन्य बिंदुओं के अतिरिक्त जोड़ना चाहिए? अन्य टिप्पणियों को सहेज सकते हैं। लेकिन स्वचालन के लिए जैसा कि बैश स्क्रिप्ट की अनुमति है, इसलिए मैं आपकी बात को देखने में विफल हूं। बेशक मुझ में प्रोग्रामर सोचता है कि ऊपर की स्क्रिप्ट
छिपी हुई है,
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.