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

94

j'utilise

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

Je veux vérifier /foo/baravec un script bash, et voir s'il a été monté? Sinon, appelez la commande mount ci-dessus, sinon faites autre chose. Comment puis-je faire ceci?

CentOS est le système d'exploitation.

Justin
la source
quelque chose comme "if [[$ (mount -l ... | fgrep ... | wc -l)]]; then ..."
bobah
Des questions similaires concernent les erreurs de serveur , le débordement de pile et l' échange de piles Unix et Linux .
Sasha

Réponses:

69

L'exécution de la mountcommande sans arguments vous indiquera les montages actuels. À partir d'un script shell, vous pouvez vérifier le point de montage avec grepet 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 avait une correspondance. Puisque je ne veux pas que la sortie soit affichée en cas de correspondance, je la redirige vers /dev/null.

Christopher Neylan
la source
4
Vous n'avez pas besoin de vérifier si elle renvoie une chaîne. greprenvoie un statut de sortie différent de zéro s'il n'y a pas de correspondance. Il n'y a pas besoin du test ou du sous-shell créé par $ (). if command | grep -q 'stuff'; then ...
jordanm
32
Cela ne fonctionne pas avec mount bind et ne doit donc pas être accepté comme réponse. Cette réponse doit être rejetée. Vous ne pouvez pas dépendre de mount | grep ...vous montrer que votre liaison de montage est toujours active. Si le périphérique sous-jacent est démonté et remonté, la liaison de montage ne connectera plus les deux fichiers / répertoires même si mountelle montre toujours qu'elle est connectée. Et si vous le faites, umount ...cela vous dira même qu'il n'est pas monté, bien mountque cela ait été dit. ÉNORME faille dans le système de fichiers Linux.
Dev Null
@DevNull: J'ai exactement le problème que vous avez décrit. Une solution à ce problème?
Isaac
@Isaac, désolé pour le retard de réponse. J'essaierais d'utiliser readlink -f, qui ne renvoie rien lorsque le chemin / fichier n'existe pas. Si le / mount / path / to_file sous-jacent n'est pas là (par readlink), le montage sous-jacent est interrompu (remontez le montage sous-jacent et la liaison). Si le fichier sous-jacent est là et readlink -findique que la version de liaison de ce fichier n'est pas là, la liaison est rompue, remontez simplement la liaison.
Dev Null
2
S'il y a une monture appelée, /mnt/md0xxxalors la commande indiquera /mnt/md0comme montée alors que ce qu'elle n'a pas à être ...
David L.
179

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 mountpointcommande.

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' -qoption, comme ceci:

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

J'espère que cela pourra aider.

Mark J. Bobak
la source
7
Vous avez en fait quelque chose monté au moment où vous avez exécuté la commande 'mountpoint'? Même si elle est destinée à être un point de montage, à moins qu'il fait a quelque chose monté, il est juste un répertoire.
Mark J.Bobak
2
+1, fonctionne également sur Ubuntu 10.10. Il est dans Ubuntu depuis la 8.04 .
l0b0
3
mountpoint est également présent dans RHEL 6.3 (probablement même dans les versions antérieures)
Joril
2
mountpoint est présent et fonctionne parfaitement sur Debian 7 ("Wheezy") et UCS 4 aussi
Lahmizzar
7
Comme mentionné dans un autre commentaire, le point de montage ne fonctionne pas avec les montages de liaison. L'extrait montera le dir plusieurs fois
csanchez
41

Le manuel de mountpointdit que:

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

Le manuel de mountdit que:

Le mode de liste est conservé à des fins de compatibilité descendante uniquement. Pour une sortie plus robuste et personnalisable, utilisez findmnt (8), en particulier dans vos scripts.

La commande correcte à utiliser est doncfindmnt , qui fait elle-même partie du util-linuxpackage et, selon le manuel:

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

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

-M, - chemin du point de montage

Définissez explicitement le fichier ou le répertoire de 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"
Jonathan H
la source
2

J'aime les réponses qui utilisent /proc/mounts, mais je n'aime pas faire un simple grep. Cela peut vous donner de faux positifs. Ce que vous voulez vraiment savoir, c'est "si l'une des lignes a cette chaîne exacte pour le champ numéro 2". Alors, posez cette question. (dans ce cas je vérifie /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
Bruno Bronosky
la source
1
C'est adorable! Exactement ce que vous voulez pour un petit système embarqué où aucun outil flashy n'aime mountpointou findmntn'existe. Réponse très simple, beaucoup de joie, tel UNIX :)
troglobit
1

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 , mountpointne fonctionne pas si montage avec bindoption 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 à la grep -qplace.

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

  • Si vous vérifiez le chemin tel que la /path/to/dir/fin avec une barre oblique inverse, le chemin dans /proc/mountsou la mountsortie est/path/to/dir
  • Dans la plupart des versions Linux, /var/run/est le lien symbolique de /run/, donc si vous montez bind pour /var/run/mypathet vérifiez s'il est monté, il s'affichera comme /run/mypathdans /proc/mounts.
Tanky Woo
la source
2
Je pense que "grep -q" $ path "/ proc / mounts" (avec espace) est encore meilleur ... Sinon is_mount ab retournera true si abc est monté?!
alfonx
0

Une autre solution propre est comme ça:

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

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

Hudson Santos
la source
Cela fait exactement la même chose que la réponse de @ ChristopherNeylan.
Jonathan H
0

Les réponses ici sont trop compliquées, il suffit de vérifier si le montage existe en utilisant:

cat /proc/mounts | tail -n 1

Cela ne produit que le dernier dossier monté, si vous voulez les voir tous, supprimez simplement la commande tail.

Gabriel Fair
la source
-4

Dans mon .bashrc, j'ai créé l'alias suivant:

alias disk-list="sudo fdisk -l"
Jordan Effinger
la source
la demande concerne le script et il est préférable d'éviter sudo et le programme dont la cible est de "manipuler la partition de disque"
bcag2