বাশ স্ক্রিপ্টিং - ফিরতি মান 0 না হওয়া পর্যন্ত লুপ


25

আমার স্ক্রিপ্টে আমার কিছু আনমাউন্ট করা দরকার, তবে কখনও কখনও সমস্ত ডেটা অনুলিপি করা শেষ হওয়ার আগেই এটি আনমাউন্ট করে এবং 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 হওয়া অবধি লুপ হওয়া উচিত নয় যার অর্থ এটি সফলভাবে সজ্জিত হয়েছিল?

উত্তর:


59

[কমান্ড শর্তাধীন অভিব্যক্তি নির্ণয় করা হয়। এটি এখানে কোন কাজে আসে না।

কারণ umountএর স্ট্যান্ডার্ড আউটপুটে কোনও কিছুই আউটপুট দেয় না (ত্রুটিগুলি স্ট্যাডারে চলে যায়), `sudo umount mount`কিছুতেই প্রসারিত হয় না।

সুতরাং এটি এর মতো:

while [ ]
do
  sleep 0.1
done

[কমান্ড, যখন পাশে কোনো আর্গুমেন্ট পাস না [এবং ]রিটার্ন মিথ্যা (ক নন-জিরো প্রস্থান স্থিতি), তাই আপনি লুপ প্রবেশ করা হবে না।

এমনকি umountstdout এ তার ত্রুটিগুলি থাকলেও, [কমান্ডটি ব্যবহার করে বোঝা যাচ্ছিল না, কারণ আউটপুটটির ফলে প্রাপ্ত শব্দগুলি কখনই একটি বৈধ শর্তযুক্ত অভিব্যক্তি তৈরি করতে পারে না।

আপনি এখানে চান:

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

দুর্দান্ত, দুর্দান্ত!
চার্লিহর্স 55

1
ব্যবহার মধ্যে পার্থক্য ব্যাখ্যা জন্য +1 [, [[বা না। আমি সাধারণত ম্যান পেজগুলি, জিএনইউ এবং / বা টিএলডিপি উদাহরণগুলি ব্যাশ শর্তাবলীর বিষয়ে এই জাতীয়
বিবরণটি

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..
Stéphane Chazelas

মনে রাখবেন যে mount remount,roইনপেনসো মাইক্রো লাইন ইউএসবি স্টিক সহ একটি এমপ্স ডিভাইস এ্যানো ২০০৯-এর একটি কমান্ড সম্পূর্ণ হতে 23 বা এমনকি 30+ সেকেন্ড সময় নিতে পারে।
প্রো ব্যাকআপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.