سؤال ما هي أفضل طريقة للتحقق من تحميل وحدة تخزين في نص Bash؟


ما هي أفضل طريقة للتحقق من تحميل وحدة تخزين في نص Bash؟

ما أرغب حقاً هو طريقة يمكنني استخدامها مثل هذا:

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 لكني لم أكن أذكر من خلال كتب كتب bash حتى الآن لمعرفة ما إذا كانت هناك طريقة أكثر مباشرة. - 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



ناهيك عن ، يمكن تعليق Hang to mount إذا كانت نقطة التثبيت مثبتة. - Chad Huneycutt
جيد لينكس ، ليس ل Freebsd أو سولاريس. - chris
هذا صحيح ، كريس. على الرغم من أن تم وضع علامة على السؤال لينكس. - 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


مثل هذا البرنامج النصي لن يكون محمولًا على الإطلاق. السر القذر في unix هو أن النواة فقط تعرف ما هي أنظمة الملفات ، وقصيرة من الأشياء مثل / proc (غير المحمولة) لن تعطيك إجابة مباشرة.

وعادةً ما استخدم df لاكتشاف ما هي نقطة التثبيت لأحد الأدلة الفرعية وما نظام الملفات الموجود فيه.

على سبيل المثال (يتطلب shell posix مثل الرماد / AT & T ksh / bash / etc)

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


ما يلي هو ما استخدمه في واحد من بلدي وظيفة النسخ الاحتياطي csync rsync. فإنه يتحقق لمعرفة ما إذا كان يتم تحميل / النسخ الاحتياطي ، ويحاول تحميله إذا لم يكن (قد يفشل لأنه محرك الأقراص في خليج تبديل الساخنة وربما لا تكون موجودة في النظام)

ملاحظة: ما يلي يعمل فقط على لينكس ، لأنه greps / proc / mounts - سيتم تشغيل نسخة محمولة أكثر 'mount | grep / backup '، كما في إجابة ماثيو ..

  إذا ! grep -q / backup / proc / mounts؛ ثم
    إذا ! جبل / النسخ الاحتياطي. ثم
      صدى "فشل"
      الخروج 1
    فاي
  فاي
  صدى "نجحت".
  # تفعل الاشياء هنا

6
2017-08-05 20:39



استفاد من فحص سلامة العقل. - Dan Carley
ويفترض أن هذه الطريقة تتعرض لنفس المشاكل مثل إجابة ماثيو بلوخ. - mwfearnley
نعم ، باستثناء مسألة المساحة في اسم الملف التي ذكرها "Eliptical view" (هذا greps السطر بأكمله ، وليس مجرد حقل المستخرج). قضية السلسلة الفرعية ليست مشكلة كبيرة ما لم تنسى بطريقة ما أن نقلا عن الحجج هو شيء يمكنك القيام به. مثلا grep -q ' /backup ' /proc/mounts أو mount | grep -q ' /backup '. أو إعادة التوجيه إلى / dev / null إذا كانت grep لا تدعم -q (التي هو في المواصفات POSIX ل grep في هذه الأيام). - 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) الأمر لكني لم ألعبها أبداً. بصراحة إذا قمت بتحديث بعض النصوص الخاصة بي التي تقوم بهذا النوع من الأشياء (أو إنشاء برامج جديدة) على مربع Linux (أو حيث يتوفر الأمر) ، فهذا ما سأفعله. - 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

من المحتمل أن تكون رسائل خطأ الصدى زائدة عن الحاجة ، لأن stat ستعرض الخطأ أيضًا.


2
2017-08-05 20:57



في الواقع ، ربما يتعين عليك التحقق من حالة الخروج من القانون الأساسي أولاً لكل مكالمة للتأكد من وجود الملف هناك ... ليس رواية كما اعتقدت :-( - Kyle Brandt♦


لا شيء من هذه تلبية حالة الاستخدام حيث دليل معين هو دليل فرعي داخل نقطة تحميل أخرى. على سبيل المثال ، قد يكون لديك / الشيء الذي هو جبل NFS لاستضافة: / real_thing. استخدام grep لهذا الغرض على / proc / mounts / etc / mtab أو "mount" لن يعمل ، لأنك ستبحث عن نقطة تركيب غير موجودة. على سبيل المثال ، / thing / thingy ليست نقطة تحميل ، ولكن يتم تثبيت / الشيء على المضيف: / real_thing. أفضل إجابة صوتت هنا هي في الواقع ليست "أفضل طريقة لتحديد ما إذا كان قد تم تركيب دليل / volumne". سأصوت لصالح استخدام "df -P" (-P POSIX standards mode) كإستراتيجية أنظف:

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 التي تعكس نقاط التحميل خارج chroot ، داخل 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 (2nd column = mount points).

ثم يتم greps الإخراج. لاحظ في ^ و $ ، وهذا يمنع / النسخ الاحتياطي من مطابقة / mnt / backup أو / النسخ الاحتياطي القديمة إلخ.


1
2018-03-27 15:59





grep / etc / mtab لنقطة التحميل الخاصة بك ربما؟


0
2017-08-05 20:21



يمكن mtab الخروج من التاريخ أو ببساطة لا يتم تحديثه بواسطة mount ، مثل عند استخدام mount -n لأن / للقراءة فقط. - chris
أوافق ، ولكن هذا يبدو وكأنه أول مكان للبدء في البحث. - Ophidian