Überprüfen Sie, ob das Verzeichnis mit bash gemountet wurde

94

ich benutze

mount -o bind /some/directory/here /foo/bar

Ich möchte /foo/barjedoch mit einem Bash-Skript überprüfen , ob es gemountet wurde. Wenn nicht, rufen Sie den obigen Befehl mount auf, andernfalls tun Sie etwas anderes. Wie kann ich das machen?

CentOS ist das Betriebssystem.

Justin
quelle
so etwas wie "wenn [[$ (mount -l ... | fgrep ... | wc -l)]]; dann ..."
Bobah
Ähnliche Fragen betreffen Serverfehler , Stapelüberlauf und Unix- und Linux-Stapelaustausch .
Sasha

Antworten:

70

Wenn Sie den mountBefehl ohne Argumente ausführen, werden die aktuellen Bereitstellungen angezeigt. In einem Shell-Skript können Sie mit grepund einer if-Anweisung nach dem Einhängepunkt suchen:

if mount | grep /mnt/md0 > /dev/null; then
    echo "yay"
else
    echo "nay"
fi

In meinem Beispiel überprüft die if-Anweisung den Exit-Code von grep, der angibt, ob eine Übereinstimmung vorliegt . Da ich nicht möchte, dass die Ausgabe angezeigt wird, wenn eine Übereinstimmung vorliegt, leite ich sie an weiter /dev/null.

Christopher Neylan
quelle
4
Sie müssen nicht überprüfen, ob eine Zeichenfolge zurückgegeben wird. grepGibt einen Exit-Status ungleich Null zurück, wenn keine Übereinstimmungen vorliegen. Der Test oder die von $ () erstellte Subshell sind nicht erforderlich. if command | grep -q 'stuff'; then ...
Jordanm
31
Dies funktioniert nicht mit Mount Bind und sollte daher nicht als Antwort akzeptiert werden. Diese Antwort sollte abgelehnt werden. Sie können sich nicht darauf verlassen mount | grep ..., Ihnen zu zeigen, dass Ihre Mount-Bindung noch aktiv ist. Wenn das zugrunde liegende Gerät nicht gemountet und erneut gemountet ist, verbindet die Mount-Bindung die beiden Dateien / Verzeichnisse nicht mehr, obwohl mountimmer noch angezeigt wird , dass es verbunden ist. Und wenn Sie dies tun umount ..., wird es Ihnen sogar sagen, dass es nicht montiert ist, obwohl es mountgesagt wurde. RIESIGER Fehler im Linux-Dateisystem.
Dev Null
@ DevNull: Ich habe genau das Problem, das Sie beschrieben haben. Irgendeine Lösung für dieses Problem?
Isaac
@Isaac, entschuldige die Verzögerung bei der Antwort. Ich würde versuchen, zu verwenden readlink -f, was nichts zurückgibt, wenn der Pfad / die Datei nicht existiert. Wenn das zugrunde liegende Mount / mount / path / to_file nicht vorhanden ist (per Readlink), ist das zugrunde liegende Mount fehlerhaft (mounten Sie das zugrunde liegende Mount und die Bindung erneut). Wenn die zugrunde liegende Datei vorhanden ist und readlink -fbesagt, dass die Bindungsversion dieser Datei nicht vorhanden ist, wird die Bindung unterbrochen. Hängen Sie die Bindung einfach erneut ein.
Dev Null
2
Wenn ein Mount aufgerufen /mnt/md0xxxwird, zeigt der Befehl /mnt/md0als gemountet an, während es nicht sein muss ...
David L.
177

Sie haben sich nicht die Mühe gemacht, ein O / S zu erwähnen.

Ubuntu Linux 11.10 (und wahrscheinlich die aktuellsten Linux-Versionen) haben den mountpointBefehl.

Hier ist ein Beispiel auf einem meiner Server:

$ mountpoint /oracle
/oracle is a mountpoint
$ mountpoint /bin
/bin is not a mountpoint

In Ihrem Fall sollten Sie die -qOption wie folgt verwenden können:

mountpoint -q /foo/bar || mount -o bind /some/directory/here /foo/bar

Hoffentlich hilft das.

Mark J. Bobak
quelle
7
Sie haben tatsächlich etwas gemountet, als Sie den Befehl 'mountpoint' ausgeführt haben? Selbst wenn es sich um einen Mountpoint handeln soll, ist es nur ein Verzeichnis, es sei denn, es ist tatsächlich etwas gemountet.
Mark J. Bobak
2
+1, funktioniert auch unter Ubuntu 10.10. Es ist seit 8.04 in Ubuntu .
10.
3
Mountpoint ist auch in RHEL 6.3 vorhanden (wahrscheinlich sogar in früheren Versionen)
Joril
2
Mountpoint ist vorhanden und funktioniert auch auf Debian 7 ("Wheezy") und UCS 4 perfekt
Lahmizzar
7
Wie in einem anderen Kommentar erwähnt, funktioniert Mountpoint nicht mit Bindungs-Mounts. Das Snippet wird das
Verzeichnis
39

Das Handbuch von mountpointsagt, dass es:

prüft, ob das angegebene Verzeichnis oder die angegebene Datei in der Datei / proc / self / mountinfo erwähnt wird.

Das Handbuch von mountsagt, dass:

Der Auflistungsmodus wird nur aus Gründen der Abwärtskompatibilität beibehalten. Verwenden Sie für eine robustere und anpassbarere Ausgabe findmnt (8), insbesondere in Ihren Skripten.

So um den richtigen Befehl zu verwenden istfindmnt , die selbst Teil des util-linuxPakets und, nach dem Handbuch:

kann in / etc / fstab, / etc / mtab oder / proc / self / mountinfo suchen

Es sucht also tatsächlich mehr Dinge als mountpoint. Es bietet auch die bequeme Option:

-M, - Mountpoint- Pfad

Definieren Sie die Mountpoint-Datei oder das Mountpoint-Verzeichnis explizit. Siehe auch --target.

Zusammenfassend können Sie Folgendes verwenden, um zu überprüfen, ob ein Verzeichnis mit bash gemountet ist:

if [[ $(findmnt -M "$FOLDER") ]]; then
    echo "Mounted"
else
    echo "Not mounted"
fi

Beispiel:

mkdir -p /tmp/foo/{a,b}
cd /tmp/foo

sudo mount -o bind a b
touch a/file
ls b/ # should show file
rm -f b/file
ls a/ # should show nothing

[[ $(findmnt -M b) ]] && echo "Mounted"
sudo umount b
[[ $(findmnt -M b) ]] || echo "Unmounted"
Jonathan H.
quelle
2

Ich mag die Antworten, die verwendet werden /proc/mounts, aber ich mag es nicht, ein einfaches 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
Bruno Bronosky
quelle
1
Das ist schön! Genau das, was Sie für ein kleines Embedded - System wollen , wo keine auffälligen Werkzeuge wie mountpointoder findmntexistieren. Sehr einfache Antwort, viel Freude, wie UNIX :)
Troglobit
1

Meine Lösung:

is_mount() {
    path=$(readlink -f $1)
    grep -q "$path" /proc/mounts
}

Beispiel:

is_mount /path/to/var/run/mydir/ || mount --bind /var/run/mydir/ /path/to/var/run/mydir/

Für Mark J. Bobak Antwort , mountpointfunktioniert nicht , wenn mit Halterung bindin unterschiedlichen Dateisystem - Option.

Für die Antwort von Christopher Neylan muss die Ausgabe von grep nicht nach / dev / null umgeleitet werden, grep -qsondern nur verwendet werden.

Das Wichtigste ist, den Pfad zu kanonisieren, indem Sie Folgendes verwendenreadlink -f $mypath :

  • Wenn Sie den Pfad wie " /path/to/dir/Ende mit Backslash" aktivieren, lautet der Pfad in /proc/mountsoder die mountAusgabe/path/to/dir
  • In den meisten Linux-Versionen /var/run/ist der Symlink von /run/. Wenn Sie also bind für mounten /var/run/mypathund prüfen, ob er gemountet ist, wird er wie /run/mypathin angezeigt /proc/mounts.
Tanky Woo
quelle
2
Ich denke, "grep -q" $ path "/ proc / mounts" (mit Leerzeichen) ist noch besser ... Andernfalls gibt is_mount ab true zurück, wenn abc gemountet ist?!
Alfonx
0

Eine andere saubere Lösung ist wie folgt:

$ mount | grep /dev/sdb1 > /dev/null && echo mounted || echo unmounted

Natürlich kann "Echo etwas" durch alles ersetzt werden, was Sie für jeden Fall tun müssen.

Hudson Santos
quelle
Dies entspricht genau der Antwort von @ ChristopherNeylan.
Jonathan H
0

Die Antworten hier sind zu kompliziert. Überprüfen Sie einfach, ob die Halterung vorhanden ist, indem Sie:

cat /proc/mounts | tail -n 1

Dies gibt nur den zuletzt gemounteten Ordner aus. Wenn Sie alle anzeigen möchten, entfernen Sie einfach den Befehl tail.

Gabriel Fair
quelle
-4

In meinem .bashrc habe ich folgenden Alias ​​erstellt:

alias disk-list="sudo fdisk -l"
Jordan Effinger
quelle
Bei der Anfrage handelt es sich um ein Skript. Vermeiden Sie am besten sudo und programmieren Sie, welches Ziel darin besteht, "die Festplattenpartition zu manipulieren"
bcag2