it-swarm.com.de

Wie kann am besten überprüft werden, ob ein Volume in einem Bash-Skript bereitgestellt ist?

Wie kann am besten überprüft werden, ob ein Volume in einem Bash-Skript bereitgestellt ist?

Was ich wirklich gerne hätte, ist eine Methode, die ich so anwenden kann:

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

Vermeide das Benutzen /etc/mtab weil es inkonsistent sein kann.

Vermeiden Sie Rohrleitungen mount, da dies nicht so kompliziert sein muss.

Einfach:

if grep -qs '/mnt/foo ' /proc/mounts; then
    echo "It's mounted."
else
    echo "It's not mounted."
fi

(Das Leerzeichen nach dem /mnt/foo soll eine Übereinstimmung vermeiden, z. /mnt/foo-bar.)

122
Dan Carley
if mountpoint -q /mnt/foo 
then
   echo "mounted"
else
   echo "not mounted"
fi

oder

mountpoint -q /mnt/foo && echo "mounted" || echo "not mounted"
61
Zaptac

findmnt -rno SOURCE,TARGET "$1" vermeidet alle Probleme in den anderen Antworten. Es erledigt die Arbeit sauber mit nur einem Befehl.


Andere Ansätze haben diese Nachteile :

  • grep -q und grep -s sind ein zusätzlicher unnötiger Schritt und werden nicht überall unterstützt.
  • /proc/\* wird nicht überall unterstützt.
  • mountinfo basiert auf/proc/..
  • cut -f3 -d' ' bringt Leerzeichen in Pfadnamen durcheinander
  • Das Parsen von mount 's Leerraum ist problematisch. Die Manpage sagt jetzt:

Der Listungsmodus wird nur aus Gründen der Abwärtskompatibilität beibehalten.

Für eine robustere und anpassbarere Ausgabe verwenden Sie findmnt (8), insbesondere in Ihren Skripten.


Bash-Funktionen :

#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

Anwendungsbeispiele :

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
21
Elliptical view

Ein solches Skript wird niemals portabel sein. Ein schmutziges Geheimnis unter Unix ist, dass nur der Kernel weiß, welche Dateisysteme wo sind, und abgesehen von Dingen wie/proc (nicht portabel) wird es Ihnen nie eine klare Antwort geben.

Normalerweise benutze ich df, um herauszufinden, was der Einhängepunkt eines Unterverzeichnisses ist und in welchem ​​Dateisystem es sich befindet.

Zum Beispiel (erfordert Posix Shell wie Asche/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

Kinda sagt Ihnen nützliche Informationen.

7
chris

folgendes verwende ich in einem meiner rsync-Backup-Cron-Jobs. Es prüft, ob/backup gemountet ist, und versucht, es zu mounten, wenn dies nicht der Fall ist (es kann fehlschlagen, weil sich das Laufwerk in einem Hot-Swap-Schacht befindet und möglicherweise nicht einmal im System vorhanden ist).

HINWEIS: Folgendes funktioniert nur unter Linux, da es greps/proc/mounts verwendet - eine portablere Version würde 'mount | ausführen grep/backup ', wie in Matthews Antwort ..

  wenn ! grep -q/backup/proc/mounts; dann wenn ! Mount/Backup; dann 
 echo "fehlgeschlagen" 
 exit 1 
 fi 
 fi 
 echo "erfolgreich". 
 # hier Sachen machen 
6
cas

Da Sie zum Mounten ohnehin ein Verzeichnis haben müssen, das gemountet wird, bestand meine Strategie immer darin, eine gefälschte Datei mit einem seltsamen Dateinamen zu erstellen, der niemals verwendet werden würde, und nur zu überprüfen, ob sie vorhanden ist. Wenn die Datei dort war, wurde an dieser Stelle nichts gemountet ...

Ich denke nicht, dass dies zum Mounten von Netzwerklaufwerken oder Ähnlichem funktioniert. Ich habe es für Flash-Laufwerke verwendet.

2
Brian Postow

Wie wäre es mit einem Vergleich der Gerätenummern? Ich habe nur versucht, an den meisten esoterischen Weg zu denken.

#!/bin/bash
if [[ $(stat -c "%d" /mnt) -ne $(stat -c "%d" /mnt/foo) ]]; then
    echo "Somethin mounted there I reckon"
fi

Es gibt einen Fehler in meiner Logik damit ...

Als eine Funktion:

#!/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

Die Echo-Fehlermeldungen sind wahrscheinlich redundant, da stat auch einen Fehler anzeigt.

2
Kyle Brandt

Es tut mir leid, dass ich das angesprochen habe, aber ich denke, das ist ziemlich nützlich:

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

Dies erhält die 2. Spalte von/proc/mounts (2. Spalte = Mountpunkte).

Dann erfasst es die Ausgabe. Beachten Sie die ^ und $, dies verhindert, dass/backup mit/mnt/backup oder/backup-old usw. übereinstimmt.

1
David

Keines davon erfüllt den Anwendungsfall, in dem ein bestimmtes Verzeichnis ein Unterverzeichnis innerhalb eines anderen Einhängepunkts ist. Zum Beispiel könnten Sie/thing haben, das ein NFS-Mount für Host ist:/real_thing. Die Verwendung von grep für diesen Zweck in/proc/mounts/etc/mtab oder 'mount' funktioniert nicht, da Sie nach einem Mount-Punkt suchen, der nicht vorhanden ist. Zum Beispiel ist/thing/thingy kein Mount-Punkt, aber/thing ist auf Host gemountet:/real_thing. Die beste Antwort, über die hier abgestimmt wurde, ist eigentlich NICHT "der beste Weg, um festzustellen, ob ein Verzeichnis/ein Volumen gemountet ist". Ich würde dafür stimmen, 'df -P' (-P POSIX-Standardmodus) als sauberere Strategie zu verwenden:

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"
}

Die Ausgabe von dies wird sein:

Mounted via: Host:/real_thing

Wenn Sie wissen möchten, was der eigentliche Einhängepunkt ist, kein Problem:

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"
}

Die Ausgabe dieses Befehls lautet:

Mounted on: /thing

Dies ist alles sehr nützlich, wenn Sie versuchen, eine Art Chroot zu erstellen, die Mount-Punkte außerhalb der Chroot innerhalb der Chroot über ein beliebiges Verzeichnis oder eine beliebige Dateiliste widerspiegelt.

1
Craig

Hängt davon ab, was Sie über das Volumen wissen, nach dem Sie suchen.

In dem speziellen Fall, in dem ich kürzlich nachgeforscht habe, ob ein bestimmtes Flash-Laufwerk bereitgestellt wurde, funktioniert es am einfachsten, die Existenz von/dev/disks/by-label/zu überprüfen. Wenn das Gerät angeschlossen ist, stellen udev-Skripte sicher, dass der Link vorhanden ist (und dass er entfernt wird, wenn das Gerät vom Stromnetz getrennt wird).

(Dies ist KEINE sehr portable Antwort. Sie funktioniert jedoch auf vielen modernen Linux-Distributionen, und die Frage wurde für Linux markiert. Sie unterscheidet sich grundlegend von den bisher genannten, sodass die Möglichkeiten erweitert werden.)

0

Ich mag die Antworten, die /proc/mounts Verwenden, aber ich mag es nicht, einen einfachen Grep zu machen. Das kann zu Fehlalarmen führen. Was Sie wirklich wissen möchten, ist "Hat eine der Zeilen genau diese Zeichenfolge für Feld Nummer 2". Stellen Sie diese Frage. (In diesem Fall überprüfe ich /opt)

awk -v status=1 '$2 == "/opt" {status=0} END {exit status}' /proc/mounts

# and you can use it in and if like so:

if awk -v status=1 '$2 == "/opt" {status=0} END {exit status}' /proc/mounts; then
  echo "yes"
else
  echo "no"
fi
0
Bruno Bronosky

Obwohl dies eine Linux-Frage ist, warum nicht portabel machen, wenn es einfach ist?

Die Handbuchseite von grep sagt:

Portable Shell-Skripte sollten sowohl -q als auch -s vermeiden und stattdessen die Standard- und Fehlerausgabe an /dev/null Umleiten.

Also schlage ich folgende Lösung vor:

if grep /mnt/foo /proc/mounts > /dev/null 2>&1; then
        echo "Mounted"
else
        echo "NOT mounted"
fi
0
fex

grep/etc/mtab für deinen Mountpunkt vielleicht?

0
Ophidian

Muss es noch komplizierter sein?

mount \
    | cut -f 3 -d ' ' \
    | grep -q /mnt/foo \
  && echo "mounted" || echo "not mounted"
0
Matthew Bloch

Diese?:

volume="/media/storage"
if mount|grep $volume; then
echo "mounted"
else
echo "not mounted"
if

Von: Ein Ubuntu-Forum

0
RateControl

Erstellen Sie eine Datei unter Ihrem Mountpoint wie check_mount und dann einfach testen ob es existiert?

if [[ -f /something/check_mount ]]; then
   echo "Mounted
   RC=$?
else
   Echo "Not mounted"
   RC=0
fi
exit $RC
0
Wiljami