GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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

Lösung 1:

Vermeiden Sie die Verwendung von /etc/mtab weil es möglicherweise inkonsistent ist.

Vermeiden Sie die Verrohrung von mount weil es gar 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 /mnt/foo ist es, Übereinstimmungen zu vermeiden, z. /mnt/foo-bar .)

Lösung 2:

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

oder

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

Lösung 3:

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 unnötiger zusätzlicher Schritt und werden nicht überall unterstützt.
  • /proc/\* wird nicht überall unterstützt. (mountpoint basiert ebenfalls auf proc).
  • mountinfo basiert auf /proc/..
  • cut -f3 -d' ' bringt Leerzeichen in Pfadnamen durcheinander
  • Parsen von Mount Der Leerraum von ist problematisch. Die Manpage sagt jetzt:

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

Verwenden Sie für eine robustere und anpassbare Ausgabe 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

Verwendungsbeispiele:

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

Lösung 4:

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

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

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

Lösung 5:

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 - eine portablere Version würde 'mount | grep /backup', wie in Matthews Antwort..

  if ! grep -q /backup /proc/mounts ; then
    if ! mount /backup ; then
      echo "failed"
      exit 1
    fi
  fi
  echo "suceeded."
  # do stuff here

Linux
  1. Der beste Weg, um (aus einem Skript) zu erkennen, ob Software installiert ist?

  2. Bash Echo Die Befehlszeile wird in der Befehlszeile selbst ausgeführt (nicht in einem Skript)?

  3. Was ist der beste Weg, um ein Signal an alle Mitglieder einer Prozessgruppe zu senden?

  4. Was ist der beste Weg, um sicherzustellen, dass nur eine Instanz eines Bash-Skripts ausgeführt wird?

  5. Bash-Shell-Skript - Suchen Sie nach einem Flag und holen Sie sich seinen Wert

Jede Möglichkeit, das Bash-Skript zu beenden, aber das Terminal nicht zu verlassen

Variablenbereich für Bash-Shell-Skripte und Funktionen im Skript

Was ist der beste Weg, um mit Speichermangel in Java umzugehen?

Was ist der Unterschied zwischen der Ausführung eines Bash-Skripts und dessen Beschaffung?

Überprüfen Sie, ob einer der Parameter eines Bash-Skripts mit einer Zeichenfolge übereinstimmt

Was ist der schnellste Weg, um ein Skript auszuführen?