2013-07-12 8 views
7

आम तौर पर एनएफएस क्लाइंट पर, का पता लगाने के लिए कैसे माउंट-प्वाइंट बैश शैल स्क्रिप्ट का उपयोग करके सर्वर-एंड से अधिक उपलब्ध या मृत नहीं है?लिनक्स शैल स्क्रिप्ट: एनएफएस माउंट-पॉइंट (या सर्वर) का पता कैसे लगाया गया है?

आम तौर पर मैं करता हूँ:

if ls '/var/data' 2>&1 | grep 'Stale file handle'; 
then 
    echo "failing"; 
else 
    echo "ok"; 
fi 

लेकिन समस्या यह है, जब विशेष रूप से एनएफएस सर्वर पूरी तरह से मर चुका है या बंद कर दिया, यहां तक ​​कि, ls आदेश, कि निर्देशिका में, क्लाइंट-साइड फांसी पर लटका दिया जाता है पर या मृत्यु हो गई। मतलब, उपरोक्त लिपि अधिक उपयोगी नहीं है।

क्या यह फिर से पता लगाने का कोई तरीका है?

उत्तर

10

"स्टेट" कमांड कुछ हद तक एक क्लीनर तरीका है:

statresult=`stat /my/mountpoint 2>&1 | grep -i "stale"` 
if [ "${statresult}" != "" ]; then 
    #result not empty: mountpoint is stale; remove it 
    umount -f /my/mountpoint 
fi 

साथ ही, आपको पता लगाने के लिए कि क्या दूरस्थ NFS शेयर उपलब्ध है rpcinfo उपयोग कर सकते हैं:

rpcinfo -t remote.system.net nfs > /dev/null 2>&1 
if [ $? -eq 0 ]; then 
    echo Remote NFS share available. 
fi 

जोड़ा गया 2013-07-15T14 : 31: 18-05: 00:

मैंने इस पर ध्यान दिया क्योंकि मैं एक ऐसी स्क्रिप्ट पर भी काम कर रहा हूं जिसे स्टेल माउंट पॉइंट्स को पहचानने की आवश्यकता है। one of the replies से प्रेरित होकर करने के लिए "वहाँ एक बासी एनएफएस माउंट पता लगाने के लिए एक अच्छा तरीका है", मुझे लगता है कि निम्नलिखित बैश में एक विशिष्ट माउंटप्वाइंट की बासांपन के लिए जाँच करने के लिए सबसे विश्वसनीय तरीका हो सकता है:

read -t1 < <(stat -t "/my/mountpoint") 
if [ $? -eq 1 ]; then 
    echo NFS mount stale. Removing... 
    umount -f -l /my/mountpoint 
fi 

"-t1 पढ़ "कुछ कारणों से स्टेट कमांड लटकने पर सबहेल से भरोसेमंद समय बनाएं।

जोड़ा गया 2013-07-17T12: 03: 23-05: 00:

read -t1 < <(stat -t "/my/mountpoint") हालांकि काम करता है, वहाँ अपनी त्रुटि उत्पादन म्यूट करने के लिए जब माउंटप्वाइंट बासी है एक तरह से होना करने के लिए प्रतीत नहीं होता। > /dev/null 2>&1 या तो सबहेल के भीतर, या कमांड लाइन के अंत में इसे तोड़ देता है। एक साधारण परीक्षण का उपयोग करना: if [ -d /path/to/mountpoint ] ; then ... fi भी काम करता है, और स्क्रिप्ट में बेहतर हो सकता है। बहुत परीक्षण के बाद मैं इसका उपयोग कर समाप्त हुआ।

जोड़ा गया 2013-07-19T13: 51: 27-05: 00:

मेरे सवाल "How can I use read timeouts with stat?" स्टेट (या rpcinfo) के उत्पादन को म्यूट करने के बारे में अतिरिक्त विस्तार प्रदान की के लिए एक उत्तर जब लक्ष्य उपलब्ध नहीं है और आदेश कुछ ही मिनटों के लिए लटकता है इससे पहले कि वह स्वयं ही समय निकाल दे। जबकि [ -d /some/mountpoint ] का उपयोग स्टेल माउंटपॉइंट का पता लगाने के लिए किया जा सकता है, आरपीसीएनएफओ के लिए कोई समान विकल्प नहीं है, और इसलिए read -t1 रीडायरेक्शन का उपयोग सबसे अच्छा विकल्प है। सबहेल से आउटपुट 2> & - के साथ म्यूट किया जा सकता है। यहाँ CodeMonkey's response से एक उदाहरण है:

mountpoint="/my/mountpoint" 
read -t1 < <(stat -t "$mountpoint" 2>&-) 
if [[ -n "$REPLY" ]]; then 
    echo "NFS mount stale. Removing..." 
    umount -f -l "$mountpoint" 
fi 

शायद अब यह सवाल पूरी तरह से उत्तर है :)।

+0

मैंने अपनी स्क्रिप्ट ** एनएफएस_automount **, [अब गिटहब पर उपलब्ध] [https://github.com/vwal/nfs_automount) में बाएं एनएफएस माउंट पॉइंट डिटेक्शन का उपयोग किया। – Ville

+3

अच्छा जवाब। मैंने 'read -t1 <<(stat -t" $ MOUNT_DIR "2> & -) '' 142' का रिटर्न मान प्रदान किया है। तो कर रहे हैं [! $? -ईक 0] 'एक परीक्षण के रूप में शायद बेहतर है। – psiphi75

+3

एक और बिंदु: 'read -t1 <<(stat -t "$ mountpoint" 2> & -)' आरोहित फ़ोल्डर में एक खुली फ़ाइल हैंडल (या समान) छोड़ देगा। इसलिए यदि आप '-l' ध्वज का उपयोग नहीं करते हैं तो माउंट विकल्प विफल हो जाएगा। आप इसके बजाय 'टाइमआउट 1 स्टेट-टी" $ माउंट पॉइंट ">/dev/null' का उपयोग कर सकते हैं। यह उस 'stat' कमांड को मार देगा और इसलिए इसे खुले फ़ाइल हैंडल को मार देगा। – psiphi75

1

विले और कोडमोन्की द्वारा दिए गए अंतिम उत्तर लगभग सही हैं। मुझे यकीन नहीं है कि किसी ने इसे कैसे देखा, लेकिन एक $ REPLY स्ट्रिंग सामग्री होने की सफलता है, विफलता नहीं। इस प्रकार, खाली $ उत्तर स्ट्रिंग का मतलब है कि माउंट पुराना है।इस प्रकार, सशर्त -z का उपयोग करना चाहिए, नहीं -n:

mountpoint="/my/mountpoint" 
read -t1 < <(stat -t "$mountpoint" 2>&-) 
if [ -z "$REPLY" ] ; then 
    echo "NFS mount stale. Removing..." 
    umount -f -l "$mountpoint" 
fi 

मैं एक वैध और अवैध माउंट बिंदु के साथ इस पर कई बार भाग गया है और यह काम करता है। -एन चेक ने मुझे रिवर्स परिणाम दिए, माउंट को प्रतिबिंबित करना बिल्कुल सही था जब यह बिल्कुल मान्य था।

इसके अलावा, डबल स्ट्रैकेट एक साधारण स्ट्रिंग चेक के लिए आवश्यक नहीं है।

संबंधित मुद्दे