web-dev-qa-db-fra.com

Vérifier si le répertoire est monté avec bash

J'utilise

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

Je veux vérifier /foo/bar si avec un script bash, et voir si il a été monté? Sinon, appelez la commande de montage ci-dessus, sinon faites autre chose. Comment puis-je faire ceci?

CentOS est le système d'exploitation.

76
Justin

L'exécution de la commande mount sans arguments vous indiquera les montages actuels. A partir d'un script Shell, vous pouvez rechercher le point de montage avec grep et une instruction if:

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

Dans mon exemple, l'instruction if vérifie le code de sortie de grep, qui indique s'il y a une correspondance. Puisque je ne veux pas que la sortie soit affichée quand il y a une correspondance, je la redirige vers /dev/null.

59
Christopher Neylan

Vous n'avez pas pris la peine de mentionner un O/S.

Ubuntu Linux 11.10 (et probablement les versions les plus récentes de Linux) ont la commande mountpoint.

Voici un exemple sur l'un de mes serveurs:

$ mountpoint /Oracle
/Oracle is a mountpoint
$ mountpoint /bin
/bin is not a mountpoint

En fait, dans votre cas, vous devriez pouvoir utiliser l'option -q, comme ceci:

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

J'espère que cela pourra aider.

154
Mark J. Bobak

Le manuel de mountpoint dit que:

vérifie si le répertoire ou le fichier donné est mentionné dans le fichier/proc/self/mountinfo.

Le manuel de mount dit que:

Le mode de liste est maintenu pour la compatibilité ascendante uniquement. Pour Une sortie plus robuste et personnalisable utilise findmnt (8), en particulier dans votre les scripts.

Donc, la commande correcte à utiliser est findmnt, qui fait elle-même partie du paquet util-linux et, selon le manuel:

est capable de rechercher dans/etc/fstab,/etc/mtab ou/proc/self/mountinfo

Donc, il recherche plus de choses que mountpoint. Il fournit également l'option pratique:

-M, --mountpoint chemin

Définissez explicitement le fichier ou le répertoire du point de montage. Voir aussi --target.

En résumé, pour vérifier si un répertoire est monté avec bash, vous pouvez utiliser:

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

Exemple:

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

Ma solution:

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

Exemple:

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

Pour La réponse de Mark J. Bobak , mountpoint ne fonctionne pas si monter avec l'option bind dans un système de fichiers différent.

Pour la réponse de Christopher Neylan , il n'est pas nécessaire de rediriger la sortie de grep vers/dev/null, utilisez simplement grep -q à la place.

Le plus important, canonisez le chemin en utilisant readlink -f $mypath:

  • Si vous vérifiez le chemin tel que /path/to/dir/ fin avec barre oblique inverse, le chemin dans la sortie /proc/mounts ou mount est /path/to/dir
  • Dans la plupart des versions de Linux, /var/run/ est le lien symbolique de /run/. Par conséquent, si vous montez une liaison pour /var/run/mypath et que vous vérifiez si elle est montée, elle affichera le code /run/mypath dans /proc/mounts.
1
Tanky Woo

Une autre solution propre est comme ça:

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

Bien sûr, "écho quelque chose" peut être remplacé par tout ce que vous devez faire pour chaque cas.

0
Hudson Santos