Wie kann am besten überprüft werden, ob ein Volume in einem Bash-Skript eingebunden 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
/etc/mtab
,/proc/mounts
sind verbunden/proc/self/mounts
. (zumindest auf Fedora 20 ist es)Antworten:
Vermeiden Sie die Verwendung,
/etc/mtab
da dies inkonsistent sein kann.Vermeiden Sie Rohrleitungen,
mount
da diese nicht so kompliziert sein müssen.Einfach:
(Das Leerzeichen nach dem
/mnt/foo
ist zu vermeiden/mnt/foo-bar
.)quelle
oder
quelle
mountpoint
stammt aus dem "initscripts" -Paket in Ubuntu / Debian.mountpoint
ist, dass überprüft wird, ob ein Bereitstellungspunkt bereitgestellt ist, nicht jedoch, ob ein Gerät bereitgestellt ist. Wenn ein Gerät mit der-x
Option übergeben wird, wird die Haupt- / Nebengerätenummer angezeigt, nicht jedoch, wenn es aktiviert ist.util-linux
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
undgrep -s
sind ein unnötiger zusätzlicher Schritt und werden nicht überall unterstützt./proc/\*
wird nicht überall unterstützt.mountinfo
basiert auf / proc / ..cut -f3 -d' '
Versaut Leerzeichen in PfadnamenBash-Funktionen:
Anwendungsbeispiele:
quelle
findmnt(8)
Befehl gesehen, aber nie wirklich damit gespielt. Ehrlich gesagt, wenn ich einige meiner Skripte aktualisieren würde, die diese Art von Dingen ausführen (oder neue erstellen), wäre dies das, was ich tun würde.findmnt
der Parameter angegeben werden muss--source encfs
, andernfalls wird das anzuhängende Verzeichnis immer berücksichtigt, da es auf den übergeordneten Mount zurückgreift.grep
Lösung , denn wenn ein Mount - Pfad seltsam ist, können Sie Fehlalarme auslösen: zB wenn ich mounten/dev/mmcblk0p1
auf~/mnt/dev/sda1
, ich konnte nicht richtig , was/dev/sda1
durch den Befehl montiert istmount | grep '/dev/sda1'
. Ich kann kein falsches positives Ergebnis erzielenfindmnt
. Gute Antwort!Ein Skript wie dieses wird niemals portierbar sein. Ein schmutziges Geheimnis in Unix ist, dass nur der Kernel weiß, wo sich die Dateisysteme befinden, und abgesehen von Dingen wie / proc (nicht portabel) wird es Ihnen keine eindeutige Antwort geben.
Normalerweise benutze ich df, um herauszufinden, wo sich der Mount-Punkt eines Unterverzeichnisses befindet und in welchem Dateisystem es sich befindet.
Zum Beispiel (erfordert eine Posix-Shell wie ash / AT & T ksh / bash / etc)
Ein bisschen erzählt Ihnen nützliche Informationen.
quelle
Folgendes verwende ich in einem meiner Rsync-Backup-Cron-Jobs. Es überprüft, ob / backup aktiviert ist, und versucht, es zu aktivieren, wenn dies nicht der Fall ist.
HINWEIS: Das Folgende funktioniert nur unter Linux, da es greps / proc / mounts - eine portablere Version würde mount | ausführen grep / backup ', wie in Matthews Antwort ..
quelle
grep -q ' /backup ' /proc/mounts
odermount | grep -q ' /backup '
. Oder Umleitung auf / dev / null , wenn Ihr grep nicht unterstützt-q
(das ist in diesen Tagen in der POSIX - Spezifikation für grep).Da Sie zum Mounten ohnehin ein Verzeichnis benötigen, 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 er existiert. Wenn die Datei dort war, wurde an dieser Stelle nichts gemountet ...
Ich denke nicht, dass dies für das Mounten von Netzwerklaufwerken oder ähnlichen Dingen funktioniert. Ich habe es für Flash-Laufwerke verwendet.
quelle
Wie wäre es mit einem Vergleich der Gerätenummern? Ich habe nur versucht, über den esoterischsten Weg nachzudenken .
Da ist ein Fehler in meiner Logik ...
Als eine Funktion:
Die Echofehlermeldungen sind wahrscheinlich redundant, da stat ebenfalls einen Fehler anzeigt.
quelle
Keines dieser Verzeichnisse erfüllt den Anwendungsfall, bei 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 den Host ist: / real_thing. Die Verwendung von grep für diesen Zweck unter / proc / mounts / etc / mtab oder 'mount' funktioniert nicht, da Sie nach einem Mount-Punkt suchen, der nicht existiert. 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 NICHT "der beste Weg, um festzustellen, ob ein Verzeichnis / Volume eingehängt ist". Ich würde dafür stimmen, 'df -P' (-P POSIX-Standardmodus) als sauberere Strategie zu verwenden:
Die Ausgabe von diesem Programm ist:
Wenn Sie wissen möchten, wie hoch der tatsächliche Einhängepunkt ist, ist dies kein Problem:
Die Ausgabe dieses Befehls lautet:
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 spiegelt.
quelle
Tut mir leid, dass ich das angesprochen habe, aber ich finde das ziemlich nützlich:
Dies ergibt die 2. Spalte von / proc / mounts (2. Spalte = Mountpunkte).
Dann greift es die Ausgabe. Beachten Sie die ^ und $, dies verhindert, dass / backup mit / mnt / backup oder / backup-old usw. übereinstimmt.
quelle
grep / etc / mtab für deinen mount point vielleicht?
quelle
Diese?:
Von: Ein Ubuntu-Forum
quelle
Obwohl dies eine Linux-Frage ist, warum sollte man es nicht portabel machen, wenn es einfach ist?
Die Manualpage von
grep
sagt:Also schlage ich folgende Lösung vor:
quelle
-q
und-s
wird von POSIX angegeben , so gibt es sowieso nicht damit jedes Portabilität Problem sein soll (jetzt wenn nicht schon vorher - ich habe nicht weiterverfolgen , welche Veränderungen geschehen , wenn).Muss es noch komplizierter sein?
quelle
grep -q /mnt/foo
passt auch zu Mountpunkten/mnt/food
und/not/mnt/foo
... Wie wäre esgrep -qx /mnt/foo
?-x
macht grep match nur wenn die ganze Zeile passt.cut -f 3 -d ' '
stolpert, wenn der Mount-Pfad ein Leerzeichen in einem Dateinamen enthält.Hängt davon ab, was Sie über die zu überprüfende Lautstärke wissen.
In dem speziellen Fall, in dem ich vor kurzem recherchiert habe, um herauszufinden, ob ein bestimmtes Flash-Laufwerk eingebunden ist, ist es am einfachsten, nach / dev / disks / by-label / zu suchen. Wenn das Gerät angeschlossen ist, stellen udev-Skripte sicher, dass der Link vorhanden ist (und dass er entfernt wird, wenn das Gerät nicht angeschlossen ist).
(Dies ist keine sehr portable Antwort. Sie funktioniert jedoch auf vielen modernen Linux-Distributionen. Die Frage wurde für Linux getaggt und unterscheidet sich grundlegend von den bisher genannten Ansätzen, sodass die Möglichkeiten erweitert werden.)
quelle
Datei unter deinem Mountpoint erstellen
check_mount
und dann einfach testen ob es existiert?quelle
Ich musste dies in Chef aus Idempotenz tun, da der Lauf, wenn Chef-Client ausgeführt wurde, aufgrund des bereits bereitgestellten Volumes fehlschlagen würde. Zum Zeitpunkt, an dem ich dies schreibe, hat die Chef-
mount
Ressource einen Fehler, der bei Attributen nicht so funktioniert, wie ich es brauchte. Deshalb habe ich das Volume mithilfe derexecute
Ressource bereitgestellt. So habe ich es gemacht:Im Falle einer Verwechslung habe ich in meiner Attributdatei Folgendes:
Dies
if not node['docker-server']['mountpoint'] == "none"
ist ein Teil einercase
Anweisung, bei der der Mount-Punkt standardmäßig verwendet wird, wenn der Mount-Punkt auf dem Server nicht angegeben istnone
.quelle