প্রশ্ন একটি বাশ স্ক্রিপ্ট একটি ভলিউম মাউন্ট করা হয় কিনা তা পরীক্ষা করার সেরা উপায় কি?


একটি বাশ স্ক্রিপ্ট একটি ভলিউম মাউন্ট করা হয় কিনা তা পরীক্ষা করার সেরা উপায় কি?

আমি সত্যিই পছন্দ করি এমন একটি পদ্ধতি যা আমি এইভাবে ব্যবহার করতে পারি:

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

91
2017-08-05 20:16


উত্স


আমি শুধু এই কাজ করার জন্য একটি স্ক্রিপ্ট লিখতে ছিল। আমার প্রথম চিন্তাটি হল / etc / mtab থেকে তথ্য পেতে, কিন্তু আমি এখনও আমার সরাসরি ব্যাচ বুকের মাধ্যমে thumbed না এখনো একটি আরো সরাসরি উপায় আছে কিনা তা দেখতে। - 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।)


105
2017-08-05 20:27



উল্লেখ না করা, মাউন্ট পয়েন্টটি wedged হয় তাহলে মাউন্ট করতে একটি কল হ্যাং করতে পারেন। - Chad Huneycutt
Linux জন্য ভাল, freebsd বা সৌরজ জন্য না। - chris
এই সত্য, ক্রিস। প্রশ্ন linux ট্যাগ যদিও। - Dan Carley
আমি অনুমান করি এটি একটি দার্শনিক প্রশ্ন - যদি সম্ভব হয় তবে আমরা জিনিসগুলিকে পোর্টেবল করতে চেষ্টা করব নাকি আমরা বিশ্বজুড়ে চলমান উইন্ডোজ / লিনাক্স এবং অনুযায়ী কাজ করবো? - chris
প্রকৃতপক্ষে, আপনি '/ mnt / foo' এর জন্য পরীক্ষা করা উচিত, অর্থাৎ। একটি স্থান দিয়ে অথবা আপনি একটি ভলিউম পেতে পারেন যেমন আপনি নামকরণ করা একটি ভলিউম মাউন্ট করেছেন। 'Fooks'। আমি মাত্র দুটি মাউন্ট পয়েন্ট, 'lmde' এবং 'lmde-home' দিয়ে সেই সমস্যাটি পেয়েছি। - 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
এই কল, যে আমার Vagrant উপর ঝুলন্ত। - 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



প্রশ্ন linux ট্যাগ করা হয়, তাই সম্ভবত এটি পোর্টেবল হতে হবে না - Rory


নিম্নলিখিত আমি আমার rsync ব্যাকআপ cron-jobs এক ব্যবহার কি। এটি / ব্যাকআপ মাউন্ট করা হয়েছে কিনা তা পরীক্ষা করে পরীক্ষা করে দেখুন এবং যদি এটি না থাকে তবে এটি মাউন্ট করার চেষ্টা করে (এটি ব্যর্থ হতে পারে কারণ ড্রাইভটি একটি হট-সোয়াপ বায়ু এবং সিস্টেমে উপস্থিত হতে পারে না)

দ্রষ্টব্য: নিম্নলিখিতগুলি শুধুমাত্র লিনাক্সে কাজ করে, কারণ এটি / proc / mounts greps - আরো পোর্টেবল সংস্করণ 'মাউন্ট' চালাবে। grep / ব্যাকআপ ', ম্যাথিউ এর উত্তর হিসাবে ..

  যদি! grep -q / ব্যাকআপ / proc / mounts; তারপর
    যদি! মাউন্ট / ব্যাকআপ; তারপর
      ইকো "ব্যর্থ"
      প্রস্থান 1
    ফাই
  ফাই
  echo "সফল হয়েছে।"
  # এখানে জিনিস না

6
2017-08-05 20:39



একটি ভাল স্যানিটি চেক বিকল্প হিসাবে উত্থাপিত। - Dan Carley
সম্ভবত এই পদ্ধতি ম্যাথু Bloch এর উত্তর হিসাবে একই সমস্যা মধ্যে সঞ্চালিত হয়। - mwfearnley
হ্যাঁ, "এলিপটিকাল ভিউ" দ্বারা উল্লিখিত স্পেস-ইন-ফিলেননাম ইস্যু ব্যতীত (এটি সমগ্র লাইনটিকে গ্রপ করে, কেবল একটি এক্সট্রাক্টেড ক্ষেত্র নয়)। উপ-স্ট্রিং ইস্যুটি একটি বড় চুক্তি নয় যদি না আপনি কোনওভাবে ভুলে যান যে উদ্ধৃতি আর্গুমেন্টগুলি এমন একটি জিনিস যা আপনি করতে পারেন। উদাহরণস্বরূপ grep -q ' /backup ' /proc/mounts অথবা mount | grep -q ' /backup '। অথবা আপনার grep সমর্থন করে না যদি / dev / null থেকে পুনঃনির্দেশিত -q (যা হয় এই দিন grep জন্য POSIX spec মধ্যে)। - cas


findmnt -rno SOURCE,TARGET "$1" অন্যান্য উত্তর সব সমস্যা এড়ানো। এটা পরিষ্কারভাবে এক কমান্ড সঙ্গে কাজ করে।


অন্যান্য পদ্ধতির এই downsides আছে:

  • পদান্বয় পর্বতএর সাদা স্থান সমস্যাযুক্ত। এটা এখন মানুষের পাতা বলেছেন:

.. তালিকা মোড শুধুমাত্র পিছনে সামঞ্জস্য জন্য রক্ষণাবেক্ষণ করা হয়।

আরো শক্তসমর্থ এবং কাস্টমাইজযোগ্য আউটপুট ব্যবহারের জন্য findmnt(8), বিশেষ করে আপনার স্ক্রিপ্টে।


  • grep -q এবং grep -s একটি অতিরিক্ত অপ্রয়োজনীয় পদক্ষেপ এবং সর্বত্র সমর্থিত হয় না।
  • /proc/\* সর্বত্র সমর্থিত হয় না।
  • mountinfo / proc / উপর ভিত্তি করে
  • cut -f3 -d' ' পাথ নাম স্পেস আপ messes

কার্যাবলী:

#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♦


এগুলির মধ্যে কোনটি ব্যবহার ক্ষেত্রে সন্তুষ্ট নয় যেখানে একটি প্রদত্ত ডিরেক্টরি অন্য মাউন্ট পয়েন্টের মধ্যে একটি সাব ডিরেক্টরি। উদাহরণস্বরূপ, হোস্ট করার জন্য আপনার কাছে NFS মাউন্ট / জিনিস থাকতে পারে: / real_thing। / Proc / mounts / etc / mtab বা 'মাউন্ট' এ এই উদ্দেশ্যে grep ব্যবহার করা কাজ করবে না, কারণ আপনি একটি মাউন্ট পয়েন্ট খুঁজছেন যা বিদ্যমান নেই। উদাহরণস্বরূপ, / thing / thingy একটি মাউন্ট পয়েন্ট নয়, তবে হোস্টে / জিনিসটি মাউন্ট করা হয়: / real_thing। এখানে ভোট দেওয়া সেরা উত্তর আসলে "কোন ডিরেক্টরি / ভলিউম মাউন্ট করা হয় কিনা তা নির্ধারণের সেরা উপায়" নয়। আমি ক্লিনার কৌশল হিসাবে 'df -P' (-P POSIX মানক মোড) ব্যবহার করে পক্ষে ভোট দিতে চাই।

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

আপনি যদি কোনও ধরণের ক্রুট তৈরির চেষ্টা করছেন তবে এটি খুব দরকারী, যেটি কিছু ইচ্ছাকৃত ডিরেক্টরি বা ফাইল তালিকার মাধ্যমে chroot এর বাইরে মাউন্ট পয়েন্টগুলি আয়না করে।


1
2017-10-24 13:59





এই আপ আনতে জন্য দুঃখিত কিন্তু আমি মনে করি এটি বেশ দরকারী:

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

এটি / proc / mounts এর দ্বিতীয় কলাম পায় (দ্বিতীয় কলাম = মাউন্ট পয়েন্ট)।

তারপর এটা আউটপুট greps। ^ এবং $ উল্লেখ্য, এটি মেলিং / মেন্ট / ব্যাকআপ বা / ব্যাকআপ-পুরানো ইত্যাদি থেকে ব্যাকআপ / ব্যাকআপ।


1
2018-03-27 15:59





আপনার মাউন্ট পয়েন্টের জন্য grep / etc / mtab সম্ভবত?


0
2017-08-05 20:21



mtab তারিখ থেকে বের হতে পারে অথবা কেবল মাউন্ট দ্বারা আপডেট করা যাবে না, যেমন আপনি যখন মাউন্ট-এন ব্যবহার করেন কারণ / কেবল-পাঠযোগ্য। - chris
আমি একমত, কিন্তু যে খুঁজছেন শুরু প্রথম জায়গা মত লাগে। - Ophidian