Come verificare se un filesystem è montato con uno script


19

Sono nuovo nello scripting ... Posso fare cose molto semplici, ma ora ho bisogno di una mano.

Ho un filesystem locale che verrà montato solo quando devo fare un backup.

Sto iniziando con questo.

#!/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

Come ho detto, sono molto semplice nello scripting. Ho sentito che puoi controllare lo stato del mountcomando guardando i codici di ritorno.

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

Non so come controllarlo. Qualche consiglio?


2
Hai un ciondolo divertente ; thennella tua sceneggiatura.
Mat,

perché stiamo esportando il MOUNT var e rimuoviamo anche il ";"
Mike Q,

Domande simili riguardano Server Fault , StackTranslate.it e Unix & Linux Stack Exchange .
sasha,

Risposte:


19

È possibile controllare il codice di stato mounte gli eseguibili più ben scritti, con il parametro speciale shell ?.

Da man bash:

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

Dopo aver eseguito il mountcomando, l'esecuzione immediata echo $?stamperà il codice di stato dal comando precedente.

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

Non tutti gli eseguibili hanno codici di stato ben definiti. Come minimo, dovrebbe uscire con un codice di successo (0) o fallimento (1), ma non è sempre così.

Per espandere (e correggere) il tuo script di esempio, ho aggiunto un ifcostrutto nidificato per maggiore chiarezza. Non è l'unico modo per testare il codice di stato ed eseguire un'azione, ma è il più facile da leggere durante l'apprendimento.

#!/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

Per ulteriori informazioni su "Exit and Exit Status", è possibile fare riferimento alla Guida avanzata di script Bash .


1
Non è necessario esportare $MOUNT. Questo script si interromperà anche se il filesystem ha qualche carattere che subirebbe un wordplitting (spazi, ecc.). Dovresti sempre citare le tue espansioni.
Chris Down,

@ChrisDown Hai ragione. Ho solo eliminato l'evidente penzoloni "; quindi". In futuro, sentiti libero di modificare la mia risposta per renderla più corretta.
George M,

Ehm ... questo si romperà ancora. Non hai ancora citato le espansioni. Su tuo consiglio, lo farò ora.
Chris Down,

Inoltre non consiglierei il collegamento alla famigerata guida allo scripting "Advanced" di Bash, è piena di errori e insegnerà alle persone a scrivere bug, non script. BashGuide è un'alternativa molto migliore.
Chris Down,

2
@ChrisDown "La divisione delle parole mangerà i tuoi bambini se non citerai correttamente le cose." Parole per cui vivere.
George M,

35

Molte distribuzioni Linux hanno il mountpointcomando. Può essere esplicitamente utilizzato per verificare se una directory è un mountpoint. Semplice come questo:

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

1
Questo approccio fallirà se provi a controllare un encfs, poiché ti imbatterai in un errore di autorizzazione negata, quando eseguito da un utente non root.
Denys S.

La mia soluzione funziona con encfs.
Theodore R. Smith,

3

Un altro modo:

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

Ciao @sungtm; sembra che tu abbia effettuato l'accesso con un nuovo account separato. Poiché il tuo account "Sun" non ha molte attività, ti suggerirò di continuare a utilizzare il tuo nuovo account "sungtm" , poiché è più semplice. Se, tuttavia, desideri unire gli account, fammi sapere contrassegnando questo commento e contatteremo il team di Stack Exchange. Grazie!
Jeff Schaller

Nota che per encfs, findmntdeve essere fornito con il parametro --source encfs, altrimenti considererà sempre la directory da montare perché ricade sul mount genitore.
Burkart,

2

Il modo più semplice che non richiede root è:

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

fi

o per vedere se non è montato:

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

fi

il mountcomando non necessita dell'accesso root, dfsi concentra sullo spazio su disco e non sui punti di montaggio ...
Philippe Gachoud,

1

Brevi dichiarazioni

Controlla se montato :

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

Verifica se non montato :

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

0

Ho provato con lo script seguente

#!/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

Solo l'input che devi dare è il nome del filesystem

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.