So prüfen Sie, ob ein Dateisystem mit einem Skript eingehängt ist


19

Ich bin neu im Scripting ... Ich kann sehr einfache Sachen machen, aber jetzt brauche ich eine Hand.

Ich habe ein lokales Dateisystem, das nur bereitgestellt wird, wenn ich eine Sicherung durchführen muss.

Ich fange damit an.

#!/bin/bash
export MOUNT=/myfilesystem

if grep -qs $MOUNT /proc/mounts; then
  echo "It's mounted."
else
  echo "It's not mounted."; then
  mount $MOUNT;
fi

Wie gesagt, ich bin sehr einfach im Scripting. Ich habe gehört, dass Sie den Status des mountBefehls anhand der Rückkehrcodes überprüfen können .

RETURN CODES
       mount has the following return codes (the bits can be ORed):
       0      success
       1      incorrect invocation or permissions
       2      system error (out of memory, cannot fork, no more loop devices)
       4      internal mount bug
       8      user interrupt
       16     problems writing or locking /etc/mtab
       32     mount failure
       64     some mount succeeded

Ich weiß nicht, wie ich das überprüfen soll. Irgendeine Anleitung?


2
Sie haben ein lustiges Schlenker ; thenin Ihrem Skript.
Mat

Warum exportieren wir die Variable MOUNT und entfernen auch das ";"
Mike Q

Ähnliche Fragen betreffen Serverfehler , Stapelüberlauf und Unix- und Linux-Stapelaustausch .
Sasha

Antworten:


19

Sie können den Statuscode mountund die am besten geschriebenen ausführbaren Dateien mit dem speziellen Shell-Parameter überprüfen ?.

Von man bash:

? Expands to the exit status of the most recently executed foreground pipeline.

Nachdem Sie den mountBefehl ausgeführt haben, wird bei sofortiger Ausführung echo $?der Statuscode des vorherigen Befehls gedruckt.

# mount /dev/dvd1 /mnt
  mount: no medium found on /dev/sr0
# echo $?
  32

Nicht alle ausführbaren Dateien haben genau definierte Statuscodes. Es sollte mindestens mit einem Erfolgscode (0) oder einem Fehlercode (1) beendet werden, aber das ist nicht immer der Fall.

Um Ihr Beispielskript zu erweitern (und zu korrigieren), habe ich der ifÜbersichtlichkeit halber ein verschachteltes Konstrukt hinzugefügt . Es ist nicht die einzige Möglichkeit, den Statuscode zu testen und eine Aktion auszuführen, aber es ist am einfachsten zu lesen, wenn Sie lernen.

#!/bin/bash
mount="/myfilesystem"

if grep -qs "$mount" /proc/mounts; then
  echo "It's mounted."
else
  echo "It's not mounted."
  mount "$mount"
  if [ $? -eq 0 ]; then
   echo "Mount success!"
  else
   echo "Something went wrong with the mount..."
  fi
fi

Weitere Informationen zu "Exit and Exit Status" finden Sie im Advanced Bash-Scripting Guide .


1
Es muss nicht exportiert werden $MOUNT. Dieses Skript bricht auch ab, wenn das Dateisystem Zeichen enthält, die durch Wortteilung getrennt werden (Leerzeichen usw.). Sie sollten immer Ihre Erweiterungen angeben.
Chris Down

@ ChrisDown Du hast recht. Ich habe nur das offensichtliche baumelnde "; dann" gelöscht. Fühlen Sie sich in Zukunft frei, meine Antwort zu bearbeiten, um sie korrekter zu machen.
George M

Äh ... das wird immer noch kaputt gehen. Sie haben die Erweiterungen noch nicht zitiert. Auf Ihren Rat werde ich es jetzt tun.
Chris Down

Ich würde auch nicht empfehlen, auf den berüchtigten "Advanced" Bash Scripting Guide zu verlinken, der voller Fehler ist und den Leuten beibringt, Fehler zu schreiben, keine Skripte. BashGuide ist eine weitaus bessere Alternative.
Chris Down

2
@ChrisDown "Wortspaltung frisst Ihre Babys, wenn Sie die Dinge nicht richtig zitieren." Worte nach denen man sich richten sollte.
George M

35

Viele Linux-Distributionen haben den mountpointBefehl. Es kann explizit verwendet werden, um zu überprüfen, ob ein Verzeichnis ein Mountpunkt ist. So einfach ist das:

#!/bin/bash    
if mountpoint -q "$1"; then
    echo "$1 is a mountpoint"
else
    echo "$1 is not a mountpoint"
fi

1
Dieser Ansatz schlägt fehl, wenn Sie versuchen, ein Encfs zu überprüfen, da Sie auf einen Fehler stoßen, dem die Berechtigung verweigert wurde, wenn er von einem Benutzer ohne Rootberechtigung ausgeführt wird.
Denys S.

Meine Lösung arbeitet mit encfs.
Theodore R. Smith

3

Ein weiterer Weg:

if findmnt ${mount_point}) >/dev/null 2>&1 ; then
  #Do something for positive result (exit 0)
else
  #Do something for negative result (exit 1)
fi

Hallo @sungtm; Sie haben sich anscheinend mit einem neuen, separaten Konto angemeldet. Da Ihr "Sun" -Konto nicht viel Aktivität aufweist, empfehle ich Ihnen, Ihr neues "sungtm" -Konto weiterhin zu verwenden, da dies einfacher ist. Wenn Sie die Konten jedoch zusammenführen möchten, teilen Sie mir dies mit, indem Sie diesen Kommentar markieren. Wir werden uns dann an das Stack Exchange-Team wenden. Vielen Dank!
Jeff Schaller

Beachten Sie, dass für encfs findmntder Parameter angegeben werden muss --source encfs, andernfalls wird das anzuhängende Verzeichnis immer berücksichtigt, da es auf den übergeordneten Mount zurückgreift.
Burkart

2

Der einfachste Weg ohne root ist:

if $(df | grep -q /mnt/ramdisk); then

fi

oder um zu sehen, ob es nicht gemountet ist:

if ! $(df | grep -q /mnt/ramdisk); then

fi

Der mountBefehl benötigt keinen Root-Zugriff, dfkonzentriert sich auf den Speicherplatz und nicht auf Mount-Punkte.
zugriff speicherplatz und

1

Kurze Aussagen

Überprüfen Sie, ob montiert :

mount|grep -q "/mnt/data" && echo "/mnt/data is mounted; I can follow my job!"

Prüfen ob nicht montiert :

mount|grep -q "/mnt/data" || echo "/mnt/data is not mounted I could probably mount it!"

0

Ich habe es mit untenstehendem Skript versucht

#!/bin/bash
echo "enter the file system to check whether its mounted or not"
read p
echo $p
for i in `cat /proc/mounts`
do
if [[ $p =~ $i ]]
then
echo "$p is mounted"
else
echo "$p is not mounted"
fi
done

Die einzige Eingabe, die Sie machen müssen, ist der Name des Dateisystems

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.