Controlla se la directory è montata con bash


94

sto usando

mount -o bind /some/directory/here /foo/bar

Voglio controllare /foo/barcon uno script bash e vedere se è stato montato? In caso contrario, chiama il comando mount sopra, altrimenti fai qualcos'altro. Come posso fare questo?

CentOS è il sistema operativo.


qualcosa come "if [[$ (mount -l ... | fgrep ... | wc -l)]]; then ..."
bobah

Domande simili sono su Server Fault , Stack Overflow e Unix e Linux Stack Exchange .
Sasha

Risposte:


70

L'esecuzione del mountcomando senza argomenti ti dirà i mount correnti. Da uno script di shell, puoi controllare il punto di montaggio con grepe un'istruzione if:

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

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


4
Non è necessario controllare se restituisce una stringa. greprestituisce uno stato di uscita diverso da zero se non ci sono corrispondenze. Non è necessario il test o la subshell creata da $ (). if command | grep -q 'stuff'; then ...
jordanm

31
Questo non funziona con mount bind e quindi non dovrebbe essere accettato come risposta. Questa risposta dovrebbe essere respinta. Non puoi dipendere dal fatto mount | grep ...che ti mostri che il tuo mount bind è ancora attivo. Se il dispositivo sottostante viene smontato e rimontato, il bind di montaggio in realtà non collegherà più i due file / directory anche se mountmostra ancora che è connesso. E se lo fai umount ...ti dirà anche che non è montato, anche se ha mountdetto che lo era. ENORME difetto nel file system Linux.
Dev Null

@ DevNull: ho esattamente il problema che hai descritto. Qualche soluzione a questo problema?
Isaac

@ Isaac, scusa per il ritardo nella risposta. Proverei a usare readlink -f, che non restituisce nulla quando il percorso / file non esiste. Se il sottostante / mount / path / to_file non è presente (per readlink), il mount sottostante è danneggiato (rimontare il mount sottostante e il binding). Se il file sottostante è presente e readlink -fdice che la versione di associazione di quel file non è presente, l'associazione è interrotta, è sufficiente rimontare l'associazione.
Dev Null

2
Se c'è una montatura chiamata /mnt/md0xxxcosì il comando indicherà /mnt/md0come montata mentre quello che non deve essere ...
David L.

178

Non ti sei preoccupato di menzionare un O / S.

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

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 l' -qopzione, in questo modo:

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

Spero che aiuti.


7
Hai effettivamente qualcosa montato nel momento in cui hai eseguito il comando "mountpoint"? Anche se deve essere un punto di montaggio, a meno che non abbia effettivamente qualcosa montato, è solo una directory.
Mark J. Bobak

2
+1, funziona anche su Ubuntu 10.10. È stato in Ubuntu dalla 8.04 .
l0b0

3
mountpoint è presente anche in RHEL 6.3 (probabilmente anche nelle versioni precedenti)
Joril

2
mountpoint è presente e funziona perfettamente anche su Debian 7 ("Wheezy") e UCS 4
Lahmizzar

7
Come accennato in un altro commento mountpoint non funziona con i mount bind. Lo snippet monterà la
directory

40

Il manuale di mountpointdice che:

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

Il manuale di mountdice che:

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

Quindi il comando corretto da usare èfindmnt , che fa parte del util-linuxpacchetto 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 l'opzione conveniente:

-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"

2

Mi piacciono le risposte che usano /proc/mounts, ma non mi piace fare un semplice grep. Questo può darti falsi positivi. Quello che vuoi veramente sapere è "le righe hanno questa stringa esatta per il campo numero 2". Quindi, fai questa domanda. (in questo caso sto controllando /opt)

awk -v status=1 '$2 == "/opt" {status=0} END {exit status}' /proc/mounts

# and you can use it in and if like so:

if awk -v status=1 '$2 == "/opt" {status=0} END {exit status}' /proc/mounts; then
  echo "yes"
else
  echo "no"
fi

1
È adorabile! Proprio quello che si vuole per un piccolo sistema embedded in cui nessuno strumento appariscente come mountpointo findmntesistere. Risposta molto semplice, molta gioia, tale UNIX :)
troglobit

1

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 , mountpointnon funziona se si monta con l' bindopzione in un file system diverso.

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

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

  • Se controlli path come /path/to/dir/end with backslash, il percorso in /proc/mountso mountoutput è/path/to/dir
  • Nella maggior parte delle versioni di Linux, /var/run/è il /run/collegamento simbolico di , quindi se monti bind per /var/run/mypathe controlli se è montato, verrà visualizzato come /run/mypathin /proc/mounts.

2
Penso che "grep -q" $ path "/ proc / mounts" (con spazio) sia ancora meglio ... Altrimenti is_mount ab restituirà true se abc è montato ?!
alfonx

0

Un'altra soluzione pulita è così:

$ mount | grep /dev/sdb1 > /dev/null && echo mounted || echo unmounted

Di sicuro, "echo qualcosa" può essere sostituito da qualsiasi cosa tu debba fare per ogni caso.


Questo sta facendo esattamente la stessa cosa della risposta di @ ChristopherNeylan.
Jonathan H

0

Le risposte qui sono troppo complicate basta controllare se il montaggio esiste usando:

cat /proc/mounts | tail -n 1

Questo restituisce solo l'ultima cartella montata, se vuoi vederli tutti rimuovi il comando tail.


-4

Nel mio .bashrc, ho creato il seguente alias:

alias disk-list="sudo fdisk -l"

la richiesta riguarda lo script ed è meglio evitare sudo e programma quale obiettivo è "manipolare la partizione del disco"
bcag2
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.