שאלה מהי הדרך הטובה ביותר לבדוק אם נפח הוא רכוב סקריפט 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 אבל אני לא thumbed דרך הספרים שלי באש עדיין כדי לראות אם יש דרך ישירה יותר. - 3dinfluence
@ 3dinfluence - כן אני יודע את זה מ לפני זמן רב, אבל /etc/mtab, /proc/mounts מקושרים /proc/self/mounts. (atleast על Fedora 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



שלא לדבר, שיחה להר יכול לתלות אם mountpoint הוא תקוע. - Chad Huneycutt
טוב לינוקס, לא עבור freebsd או Solaris. - 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
זו השיחה, שהנער שלי תלוי בה. - dhill
הבעיה עם mountpoint היא כי זה בודק, למעשה, אם נקודת הרכבה מותקן, אבל לא אם המכשיר מותקן. אם התקן מועבר עם -x אפשרות זה אומר לך את מספר המכשיר העיקרי / מינור, אבל לא אם הוא רכוב. - vegatripy


תסריט כזה לא הולך להיות נייד. סוד מלוכלך ב- Unix הוא שרק הקרנל יודע אילו מערכות קבצים נמצאות במקום, וקיצור של דברים כמו / proc (לא נייד) הוא לעולם לא ייתן לך תשובה ישירה.

אני בדרך כלל משתמש ב- df כדי לגלות מה נקודת ההרמה של ספריית משנה, ואיזה מערכת קבצים היא נמצאת.

לדוגמה (דורש פגז posix כמו אפר / AT & T ksh / באש / וכו ')

case $(df  $mount)
in
  $(df  /)) echo $mount is not mounted ;;
  *) echo $mount has a non-root filesystem mounted on it ;;
esac

Kinda אומר לך מידע שימושי.


6
2017-08-05 20:32



השאלה מתויגת לינוקס, אז אולי זה לא צריך להיות נייד - Rory


להלן מה אני משתמש באחד גיבוי שלי csron cron-jobs. זה בודק אם הוא / גיבוי מותקן, ומנסה לטעון אותו אם הוא לא (זה עלול להיכשל כי הכונן הוא במפרץ חם להחליף ואולי אפילו לא נוכחים במערכת)

הערה: להלן רק עובד על לינוקס, כי זה greps / proc / mounts - גרסה ניידת יותר יפעל "הר | grep / גיבוי ', כמו בתשובתו של מתיו ..

  אם ! grep -q / backup / proc / mounts; לאחר מכן
    אם ! mount / גיבוי; לאחר מכן
      הד "נכשל"
      יציאה 1
    Fi
  Fi
  הד "השתדל".
  # לעשות דברים כאן

6
2017-08-05 20:39



הצטייר כחלופה טובה לבדיקת שפיות. - Dan Carley
סביר להניח ששיטה זו מתמקדת באותן בעיות כמו תשובתו של מתיו בלוך. - mwfearnley
כן, למעט את שם הקובץ ב- filename המוזכר על ידי "תצוגה אליפטי" (זה greps את כל השורה, לא רק שדה חילוץ). נושא מחרוזת משנה היא לא עניין גדול, אלא אם כן איכשהו לשכוח כי ציטטות הוא דבר שאתה יכול לעשות. למשל grep -q ' /backup ' /proc/mounts או mount | grep -q ' /backup '. או להפנות אל / dev / null אם ה- grep שלך אינו תומך -q (איזה J ב מפרט POSIX עבור grep בימים אלה). - cas


findmnt -rno SOURCE,TARGET "$1" נמנע מכל הבעיות שבתשובות האחרות. זה נקי עושה את העבודה עם פקודה אחת בלבד.


גישות אחרות יש חסרונות אלה:

  • ניתוח הרהמרחב הלבן הוא בעייתי. זה דף האיש אומר עכשיו:

.. מצב הרישום נשמר עבור תאימות לאחור בלבד.

לקבלת פלט חזק יותר להתאמה אישית לא(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) אבל מעולם לא שיחקתי עם זה. למען האמת, אם הייתי לעדכן כמה סקריפטים שלי לעשות את זה סוג של דבר (או לעשות חדשים) על קופסת לינוקס (או איפה הפקודה זמינה) זה מה שהייתי עושה. - 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 מצב סטנדרטים) כאסטרטגיה נקייה:

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