GNU/Linux >> Linux Esercitazione >  >> Linux

Controlla se la directory è stata montata con bash

Non ti sei preso la briga di menzionare un O/S.

Ubuntu Linux 11.10 (e probabilmente le versioni più aggiornate di Linux) hanno il mountpoint comando.

Ecco un esempio su uno dei miei server:

$ mountpoint /oracle
/oracle is a mountpoint
$ mountpoint /bin
/bin is not a mountpoint

In realtà, nel tuo caso, dovresti essere in grado di utilizzare il -q opzione, come questa:

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

Spero di esserti stato d'aiuto.


Il manuale di mountpoint dice che:

controlla se la directory o il file specificato è menzionato nel file /proc/self/mountinfo.

Il manuale di mount dice che:

La modalità elenco viene mantenuta solo per compatibilità con le versioni precedenti. Per un output più affidabile e personalizzabile usa findmnt(8), specialmente nei tuoi script.

Quindi il comando corretto da usare è findmnt , che a sua volta fa parte del util-linux pacchetto e, secondo il manuale:

è in grado di cercare in /etc/fstab, /etc/mtab o /proc/self/mountinfo

Quindi in realtà cerca più cose di mountpoint . Fornisce inoltre la comoda opzione:

-M, --mountpoint percorso

Definire in modo esplicito il file o la directory del punto di montaggio. Vedi anche --target.

In sintesi, per verificare se una directory è montata con bash, puoi usare:

if [[ $(findmnt -M "$FOLDER") ]]; then
    echo "Mounted"
else
    echo "Not mounted"
fi

Esempio:

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"

La mia soluzione:

is_mount() {
    path=$(readlink -f $1)
    grep -q "$path" /proc/mounts
}

Esempio:

is_mount /path/to/var/run/mydir/ || mount --bind /var/run/mydir/ /path/to/var/run/mydir/

Per la risposta di Mark J. Bobak, mountpoint non funziona se montato con bind opzione in un filesystem diverso.

Per la risposta di Christopher Neylan, non è necessario reindirizzare l'output di grep a /dev/null, basta usare grep -q invece.

Il più importante, canonicalizzare il percorso utilizzando readlink -f $mypath :

  • Se controlli un percorso come /path/to/dir/ termina con una barra rovesciata, il percorso in /proc/mounts o mount l'output è /path/to/dir
  • Nella maggior parte delle versioni di Linux, /var/run/ è il collegamento simbolico di /run/ , quindi se monti bind per /var/run/mypath e controlla se è montato, verrà visualizzato come /run/mypath in /proc/mounts .

Eseguendo il mount comando senza argomenti ti dirà i mount correnti. Da uno script di shell, puoi controllare il punto di montaggio con grep e un'istruzione if:

if mount | grep /mnt/md0 > /dev/null; then
    echo "yay"
else
    echo "nay"
fi

Nel mio esempio, l'istruzione if controlla il codice di uscita di grep , che indica se c'era una corrispondenza. Dal momento che non voglio che l'output venga visualizzato quando c'è una corrispondenza, lo sto reindirizzando a /dev/null .


Linux
  1. Eseguire script Bash all'ingresso di una directory?

  2. Come verificare se è montata una directory particolare?

  3. Bash -c con parametri posizionali?

  4. Controlla quanto tempo impiega uno script Bash per essere eseguito con il comando Time

  5. Qual è il modo migliore per verificare se un volume è montato in uno script Bash?

Come verificare se esiste un file o una directory in Bash

Come verificare se un file o una directory esiste in Bash

Comando CD Linux con esempi

Monta una cartella remota con sshfs

Come verificare se esiste un file o una directory in Bash Shell

Come utilizzare il montaggio SSHFS con directory remote su SSH