बैश स्क्रिप्टिंग - लूप जब तक रिटर्न वैल्यू 0 न हो


25

मुझे अपनी स्क्रिप्ट में कुछ umount करने की आवश्यकता है, लेकिन कभी-कभी यह अनमाउंट करने से पहले सभी डेटा को कॉपी किया जा रहा है और umount विफल होने का कारण बनता है। मैंने एक "ब्लॉकिंग" ऑमाउंट करने का तरीका खोजा, लेकिन मुझे कुछ नहीं मिला। इसलिए, मैंने एक स्क्रिप्ट को लूप में लिखने की कोशिश की जब तक कि यह अनमाउंट नहीं हो सकती, लेकिन यह काम नहीं करता है।

while [ `sudo umount mount` ]
do
    sleep 0.1
done
rmdir mount

जब आउटपुट चलाते हैं:

umount: /home/evantandersen/mount: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
rmdir: failed to remove `mount': Device or resource busy

क्या यह तब तक लूप नहीं होना चाहिए जब तक कि रिटर्न वैल्यू sudo umount mount0 नहीं है, इसका मतलब यह है कि इसे सफलतापूर्वक umounted किया गया है?

जवाबों:


59

[आदेश सशर्त भाव मूल्यांकन करना है। इसका यहां कोई फायदा नहीं है।

क्योंकि umountइसके मानक आउटपुट पर कुछ भी आउटपुट नहीं होता है (त्रुटियाँ stderr पर जाती हैं), `sudo umount mount`कुछ भी नहीं फैलता है।

तो यह इस तरह है:

while [ ]
do
  sleep 0.1
done

[आदेश, जब बगल में किसी भी तर्क पारित नहीं किया [और ]रिटर्न झूठी (एक गैर शून्य बाहर निकलने की स्थिति) है, तो आप पाश में प्रवेश नहीं करेगा।

यहां तक ​​कि अगर umountस्टडआउट पर इसकी त्रुटियों का उत्पादन किया गया था, तो [कमांड का उपयोग करने का कोई मतलब नहीं होगा, क्योंकि उस आउटपुट के परिणामस्वरूप शब्द कभी भी एक वैध सशर्त अभिव्यक्ति नहीं बना सकते हैं।

यहाँ आप चाहते हैं:

until sudo umount mount
do
  sleep 0.1
done

यही है, आप sudo / umount की निकास स्थिति की जांच करना चाहते हैं, [कमांड की नहीं।

यदि आप यह जाँचना चाहते हैं कि क्या umountआउटपुट में कोई त्रुटि या चेतावनी है, [तो यह उपयोगी हो सकता है। -n "some-string"एक सशर्त द्वारा मान्यता प्राप्त अभिव्यक्ति है [परीक्षण करने के लिए आदेश है कि क्या "some-string"खाली है या नहीं, कुछ की तरह तो:

while [ -n "$(sudo umount mount 2>&1 > /dev/null)" ]; do
  sleep 0.1
done

लेकिन त्रुटि या चेतावनी संदेशों की उपस्थिति की तलाश आमतौर पर एक बुरा विचार है। umount आदेश हमें बताता है या नहीं, यह अपने से बाहर निकलें कोड, और अधिक विश्वसनीय है कि के साथ सफल होता है। यह सफल हो सकता है और फिर भी कुछ चेतावनी संदेश का उत्पादन कर सकता है। यह विफल हो सकता है और त्रुटि को आउटपुट नहीं कर सकता (जैसे कि जब यह मारा जाता है)।

इस विशेष मामले में, ध्यान दें कि umountविफल हो सकता है क्योंकि निर्देशिका माउंट नहीं है, और आप उस मामले में हमेशा के लिए लूप करेंगे, इसलिए आप अपना दृष्टिकोण आज़मा सकते हैं:

while mountpoint -q mount && ! sudo umount mount; do
  sleep 0.1
done

या यदि "माउंट" कई बार लगाया जा सकता है और आप उन सभी को अनमाउंट करना चाहते हैं:

while mountpoint -q mount; do
  sudo umount mount || sleep 0.1
done

काम करता है, कमाल!
चार्लीहोरसे

1
+1 का उपयोग करने [, [[या न करने के बीच के अंतर को समझाने के लिए । मैं विशिष्ट मैन पेजों, GNU और / या TLDP उदाहरणों के बारे में
बताती हूं

5

पुन: प्रयोज्य समारोह, और 'एन' सेकंड में मध्यांतर होगा

_umount() {
    [[ $# -lt 2 ]] && { 
        echo "Usage: ${FUNCNAME} <timeout_secs> <mnt_point>"; return 1
    }
    timeout=$(($(date +%s) + ${1}))
    until umount "${2}" 2>/dev/null || [[ $(date +%s) -gt $timeout ]]; do
       :
    done
}

सोने की कोई जरूरत नहीं


1
[[...]]है ksh/ bash/ zshविशिष्ट है, जो सभी के लिए है $SECONDS:, विशेष चर तो तुम कर सकते होSECONDS=0; until umount... || ((SECONDS > $1)); do..
स्टीफन Chazelas

ध्यान रखें कि mount remount,roIntenso Micro Line USB स्टिक के साथ mips डिवाइस anno 2009 पर एक कमांड को पूरा होने में 23 या 30+ सेकंड का समय लग सकता है ।
प्रो बैकअप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.