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


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

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

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

90
2017-08-05 20:16


मूल


मैं खुद ऐसा करने के लिए एक स्क्रिप्ट लिखने वाला था। मेरा पहला विचार / etc / mtab से जानकारी प्राप्त करना है, लेकिन मैंने अभी तक अपनी बैश पुस्तकों के माध्यम से अंगूठे नहीं डाली है यह देखने के लिए कि क्या कोई और सीधा तरीका है। - 3dinfluence
@ 3dinfluence - हाँ मुझे यह बहुत समय पहले पता है, लेकिन /etc/mtab, /proc/mounts से जुड़े हुए हैं /proc/self/mounts। (कम से कम फेडोरा 20 पर यह है) - Wilf


जवाब:


प्रयोग करने से बचें /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।)


103
2017-08-05 20:27



उल्लेख नहीं है, माउंटपॉइंट wedged अगर माउंट करने के लिए एक कॉल लटका सकता है। - Chad Huneycutt
लिनक्स के लिए अच्छा, फ्रीब्स या सौर के लिए नहीं। - chris
यह सच है, क्रिस। हालांकि सवाल लिनक्स टैग किया गया था। - Dan Carley
मुझे लगता है कि यह एक दार्शनिक सवाल है - क्या हमें संभव होने पर चीजों को पोर्टेबल बनाने का प्रयास करना चाहिए या क्या हमें लगता है कि पूरी दुनिया की चल रही खिड़कियां / लिनक्स और तदनुसार कार्य करें? - chris
दरअसल, आपको '/ mnt / foo', यानी परीक्षण करना चाहिए। एक स्थान के साथ या यदि आप नाम की मात्रा को आरोहित करते हैं तो आपको झूठी सकारात्मक मिल सकती है। 'Fooks'। मुझे बस उस मुद्दे को दो माउंट प्वाइंट, 'एलएमडीई' और 'एलएमडीई-होम' के साथ मिला। - marlar


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

या

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

53
2018-01-04 08:33



सिर्फ जानकारी के लिए: mountpoint उबंटू / डेबियन में "initscripts" पैकेज में उत्पन्न होता है। - blueyed
मेरे लिए काम नहीं किया - :-( - Wilf
यह कॉल है, कि मेरा वाग्रेंट लटका हुआ है। - dhill
के साथ समस्या mountpoint यह वास्तव में, अगर माउंट पॉइंट घुड़सवार है, तो जांचता है, लेकिन यदि कोई डिवाइस घुड़सवार नहीं है। यदि डिवाइस के साथ पास किया गया है -x विकल्प यह आपको प्रमुख / मामूली डिवाइस नंबर बताता है, लेकिन अगर यह घुड़सवार नहीं है। - vegatripy


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

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

उदाहरण के लिए (राख / एटी एंड टी क्ष / बैश / आदि जैसे पॉज़िक्स खोल की आवश्यकता है)

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

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


6
2017-08-05 20:32



सवाल लिनक्स टैग किया गया है, तो हो सकता है कि यह पोर्टेबल नहीं है - Rory


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

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

  अगर ! grep -q / बैकअप / proc / माउंट; फिर
    अगर ! माउंट / बैकअप; फिर
      गूंज "असफल"
      बाहर निकलें 1
    फाई
  फाई
  गूंज "सफल"।
  # यहाँ सामान करो

6
2017-08-05 20:39



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


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


अन्य दृष्टिकोणों में इन डाउनसाइड्स हैं:

  • पदच्छेद पर्वतसफेद जगह समस्याग्रस्त है। यह मैन पेज अब कहता है:

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

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


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

कार्य:

#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

5
2018-03-15 16:42



लिनक्स विशिष्ट के लिए वैसे भी यह वास्तव में सबसे अच्छा तरीका है। मैंने देखा है findmnt(8) आदेश लेकिन मैंने वास्तव में इसके साथ कभी नहीं खेला। स्पष्ट रूप से अगर मैं अपनी कुछ स्क्रिप्ट्स को अपडेट करना चाहता था जो लिनक्स बॉक्स (या जहां कमांड उपलब्ध है) पर इस तरह की चीज (या नए बनाते हैं) करते हैं तो यह वही है जो मैं करता हूं। - Pryftan


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

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


2
2017-08-05 20:36





डिवाइस नंबर की तुलना करने के बारे में कैसे? मैं बस सबसे ज्यादा सोचने की कोशिश कर रहा था गुप्त मार्ग..

#!/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

गूंज त्रुटि संदेश शायद अनावश्यक हैं, क्योंकि स्टेट भी एक त्रुटि प्रदर्शित करेगा।


2
2017-08-05 20:57



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


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

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
2017-10-24 13:59