Frage Was ist der beste Weg zu überprüfen, ob ein Volume in einem Bash-Skript eingebunden ist?


Was ist der beste Weg zu überprüfen, ob ein Volume in einem Bash-Skript eingebunden ist?

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

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

90
2017-08-05 20:16


Ursprung


Ich wollte gerade ein Skript schreiben, um das selbst zu machen. Mein erster Gedanke ist, Informationen aus / etc / mtab zu bekommen. Aber ich habe noch nicht meine Bash-Bücher durchgeschaut, um zu sehen, ob es einen direkteren Weg gibt. - 3dinfluence
@ 3dinfluence - ja ich weiß das schon lange her, aber /etc/mtab, /proc/mounts sind verknüpft mit /proc/self/mounts. (Atleast auf Fedora 20 ist es) - Wilf


Antworten:


Vermeide das Benutzen /etc/mtab weil es inkonsistent sein könnte.

Rohrleitungen vermeiden mount weil es 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

(Der Raum nach dem /mnt/foo ist es zu vermeiden, dass z.B. /mnt/foo-bar.)


103
2017-08-05 20:27



Ganz zu schweigen davon, dass ein Aufruf von mount hängen kann, wenn der Mountpoint verkeilt ist. - Chad Huneycutt
Gut für Linux, nicht für FreeBSD oder Solaris. - chris
Das ist wahr, Chris. Obwohl die Frage mit Linux getaggt wurde. - Dan Carley
Ich denke, das ist eine philosophische Frage - sollten wir versuchen, Dinge portabel zu machen, wenn möglich, oder sollten wir einfach davon ausgehen, dass alle weltweit Windows / Linux laufen und entsprechend handeln? - chris
Eigentlich solltest du nach '/ mnt / foo' suchen, d. mit einem Leerzeichen oder Sie erhalten möglicherweise ein falsches positives Ergebnis, wenn Sie ein Volume namens z. "fooks". Ich habe gerade dieses Problem mit zwei Mountpunkten, "lmde" und "lmde-home", bekommen. - marlar


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

oder

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

53
2018-01-04 08:33



Nur zur Information: mountpoint stammt aus dem Paket "initscripts" in Ubuntu / Debian. - blueyed
Habe nicht für mich gearbeitet - :-( - Wilf
Das ist der Ruf, an dem mein Vagrant hängt. - dhill
Das Problem mit mountpoint ist, dass es in der Tat überprüft, ob ein Mount-Punkt gemountet ist, aber nicht, wenn ein Gerät gemountet ist. Wenn ein Gerät mit dem übergeben wird -x option es sagt Ihnen die Major / Minor-Gerätenummer, aber nicht, wenn es montiert ist. - vegatripy


Ein Skript wie dieses wird niemals portabel sein. Ein schmutziges Geheimnis in Unix ist, dass nur der Kernel weiß, welche Dateisysteme wo sind, und kurz von Dingen wie / proc (nicht portierbar) wird es dir niemals eine direkte Antwort geben.

Ich benutze normalerweise df, um herauszufinden, was der Mount-Punkt eines Unterverzeichnisses ist und welches Dateisystem es ist.

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 dir nützliche Informationen.


6
2017-08-05 20:32



Die Frage ist mit Linux getaggt, also muss es vielleicht nicht tragbar sein - Rory


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

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

  ob ! grep -q / backup / proc / mounts; dann
    ob ! mount / backup; dann
      Echo "fehlgeschlagen"
      Ausgang 1
    fi
  fi
  echo "erfolgreich"
  # Mach Sachen hier

6
2017-08-05 20:39



Upvoted als eine gute Gesundheitsprüfung Alternative. - Dan Carley
Vermutlich läuft diese Methode auf die gleichen Probleme wie Matthew Blochs Antwort. - mwfearnley
yeah, mit Ausnahme des Problems "Leerzeichen in Dateinamen", das in "Eliptische Ansicht" erwähnt wird (dies gräbt die gesamte Zeile, nicht nur ein extrahiertes Feld). Das Unterstring-Problem ist keine große Sache, es sei denn, Sie vergessen irgendwie, dass das Zitieren von Argumenten eine Sache ist, die Sie tun können. z.B. grep -q ' /backup ' /proc/mounts oder mount | grep -q ' /backup '. Oder redirect zu / dev / null, wenn dein grep nicht unterstützt -q (welche ist in der POSIX-Spezifikation für Grep in diesen Tagen). - cas


findmnt -rno SOURCE,TARGET "$1" vermeidet alle Probleme in den anderen Antworten. Mit nur einem Befehl erledigt er die Aufgabe sauber.


Andere Ansätze haben diese Nachteile:

  • Parsing montierenDer Leerraum ist problematisch. Es ist die Manpage, die jetzt sagt:

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

Für eine robustere und anpassbare Ausgabe Findmnt(8), besonders in deinen Skripten.


  • 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' ' vermasselt Leerzeichen in Pfadnamen

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

5
2018-03-15 16:42



Für Linux-spezifische ist dies wirklich der beste Ansatz. Ich habe das gesehen findmnt(8) Befehl, aber ich habe nie wirklich damit gespielt. Ehrlich gesagt, wenn ich einige meiner Skripte, die diese Art von Dingen machen (oder neue machen), auf einer Linux-Box aktualisieren würde (oder wo der Befehl verfügbar ist), würde ich das tun. - Pryftan


Da, um mounten zu können, dort sowieso ein Verzeichnis vorhanden sein muss, das übermontiert wird, bestand meine Strategie immer darin, eine gefälschte Datei mit einem seltsamen Dateinamen zu erstellen, die niemals verwendet würde, und einfach nach ihrer Existenz zu suchen. Wenn die Datei dort war, dann war nichts an dieser Stelle montiert ...

Ich denke nicht, dass dies für die Installation von Netzwerklaufwerken oder solchen Dingen funktioniert. Ich habe es für Flash-Laufwerke verwendet.


2
2017-08-05 20:36





Wie wäre es mit dem Vergleich von Gerätenummern? Ich habe nur versucht, am meisten zu denken esoterisch Weg..

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

Da ist ein Fehler in meiner Logik mit ...

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 ebenfalls einen Fehler anzeigt.


2
2017-08-05 20:57



Eigentlich müsste ich für jeden Aufruf zuerst den Exit-Status von stat überprüfen, um sicherzugehen, dass die Datei da ist ... nicht so neu wie ich dachte :-( - Kyle Brandt♦