it-swarm.com.de

Prüfen Sie, ob das Verzeichnis mit Bash gemountet ist

Ich benutze

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

Ich möchte /foo/bar zwar mit einem Bash-Skript überprüfen und sehen, ob es eingehängt wurde. Wenn nicht, rufen Sie den obigen Mount-Befehl auf, sonst machen Sie etwas anderes. Wie kann ich das machen?

CentOS ist das Betriebssystem.

76
Justin

Wenn Sie den Befehl mount ohne Argumente ausführen, werden Ihnen die aktuellen Mounts angezeigt. Von einem Shell-Skript aus können Sie mit grep und 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 bei Übereinstimmung angezeigt wird, leite ich sie an /dev/null um.

59

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

Ubuntu Linux 11.10 (und wahrscheinlich die aktuellsten Linux-Varianten) haben den Befehl mountpoint.

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 in der Lage sein, die -q-Option wie folgt zu verwenden:

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

Hoffentlich hilft das.

154
Mark J. Bobak

Das Handbuch von mountpoint sagt, dass es:

prüft, ob das angegebene Verzeichnis oder die angegebene Datei in der Datei/proc/self/mountinfo angegeben ist.

Das Handbuch von mount sagt folgendes:

Der Auflistungsmodus wird nur aus Gründen der Abwärtskompatibilität beibehalten. Zum Robustere und anpassbare Ausgabe verwenden Sie findmnt (8), insbesondere in Ihrem Skripte.

Daher ist der korrekte Befehl findmnt, der selbst Teil des Pakets util-linux ist und laut Handbuch:

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

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

-M, --Mountpoint Pfad

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

Zusammenfassend können Sie zur Überprüfung, ob ein Verzeichnis mit Bash gemountet ist, Folgendes verwenden:

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"
22
Sheljohn

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. Bobaks Antwort , mountpoint funktioniert nicht, wenn das Mounten mit der Option bind in einem anderen Dateisystem erfolgt.

Für Christopher Neylans Antwort muss die Ausgabe von grep nicht nach/dev/null umgeleitet werden. Verwenden Sie stattdessen grep -q.

Das wichtigste, kanonisieren Sie den Pfad mit readlink -f $mypath:

  • Wenn Sie einen Pfad wie /path/to/dir/ ende mit Backslash überprüfen, lautet der Pfad in /proc/mounts oder mount die Ausgabe /path/to/dir.
  • In den meisten Linux-Releases ist /var/run/ der Symlink von /run/. Wenn Sie also bind für /var/run/mypath einhängen und prüfen, ob es eingehängt ist, wird es in /run/mypath als /proc/mounts angezeigt.
1
Tanky Woo

Eine andere saubere Lösung ist so:

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

Sicherlich kann "Echo etwas" durch das ersetzt werden, was Sie für jeden Fall tun müssen.

0
Hudson Santos