37 votes

Comment tester si un chemin donné est un point de montage ?

Supposons que vous voulez tester si /mnt/disk est un point de montage dans un script shell. Comment faites-vous cela ?

56voto

Andrea Francia Points 2894

Je découvre que sur mon Fedora 7, il existe une commande mountpoint.

De man mountpoint :

NAME
       mountpoint - see if a directory is a mountpoint

SYNOPSIS
       /bin/mountpoint [-q] [-d] /path/to/directory
       /bin/mountpoint -x /dev/device

Apparemment, elle est fournie avec le paquet sysvinit, je ne sais pas si cette commande est disponible sur d'autres systèmes.

[root@myhost~]# rpm -qf $(which mountpoint)
sysvinit-2.86-17

2 votes

Les solutions qui analysent la sortie /etc/mtab peuvent fournir une réponse erronée : Le système de fichiers racine peut être monté en lecture seule, et /etc/mtab peut ne pas avoir été mis à jour depuis le dernier démarrage. mount(8) imprime souvent simplement le contenu de /etc/mtab, et donnera une mauvaise réponse pour la même raison.

0 votes

Merci pour cela. Notez également que la commande sort avec le statut 1 si le répertoire n'est pas un point de montage, ce qui est très utile.

8 votes

Notez que le mountpoint Actuellement, la commande compare simplement le numéro de périphérique de stat(dir) avec lstat(dir/..) (similaire à l'autre réponse), et il échoue si le point de montage a été monté à l'aide de la commande mount --bind vers une autre partie du même système de fichiers.

23voto

ephemient Points 87003

Ne pas s'appuyer sur mount , /etc/mtab , /proc/mounts etc :

if [ `stat -c%d "$dir"` != `stat -c%d "$dir/.."` ]; then
    echo "$dir is mounted"
else
    echo "$dir is not mounted"
fi

Quand $dir est un point de montage, il a un numéro de périphérique différent de celui de son répertoire parent.

L'avantage par rapport aux alternatives listées jusqu'à présent est que vous n'avez pas à analyser quoi que ce soit, et qu'il fait la bonne chose si dir=/some//path/../with///extra/components .

L'inconvénient est qu'il ne marque pas / comme point de montage. Eh bien, c'est assez facile de faire un cas spécial, mais quand même.

2 votes

+1... Pour info, j'ai dû utiliser 'stat -c%d "/path"' au lieu des options que vous avez décrites pour comparer les numéros de périphériques. Il se peut que ce soit simplement une différence dans nos systèmes ; je suis sur RHEL 5.5. Pour les autres, voir man stat(2) si vous voulez faire cela dans un programme.

3 votes

Cela ne semble pas fonctionner avec mount --bind points de montage. Monté ou non monté le si est toujours fausse. Ne fonctionne pas même avec stat -c%d - C'est également le cas sur RHEL.

0 votes

@ephemient : J'ai dû le lire deux fois. Ce n'était pas clair la première fois. La lecture de la page stat man m'a aidé à comprendre ce que vous faites. J'ai peut-être manqué de remarquer cette excellente réponse. Merci.

5voto

Utilisation de GNU find

find <directory> -maxdepth 0 -printf "%D" 

donnera le numéro de périphérique du répertoire. S'il diffère entre le répertoire et son parent, vous avez un point de montage.

Ajoutez /. au nom du répertoire si vous souhaitez que les liens symboliques vers différents systèmes de fichiers soient fichiers différents (vous le voudrez toujours pour le parent).

Inconvénients : utilise GNU find donc moins portable

Avantages : Signale les points de montage non enregistrés dans /etc/mtab.

3voto

Howard Points 28

Malheureusement, mountpoint et stat auront tous deux pour effet secondaire de MONTAGE le répertoire que vous testez si vous utilisez automount. Ou du moins, c'est le cas pour moi sur Debian en utilisant auto cifs sur un disque WD MyBookLive en réseau. Je me suis retrouvé avec une variante du /proc/mounts rendue plus complexe car chaque POTENTIEL mount est déjà dans /proc/mounts même s'il n'est pas réellement monté !

cut -d ' ' -f 1 < /proc/mounts | grep -q '^//disk/Public$' && umount /tmp/cifs/disk/Public

Where
   'disk' is the name of the server (networked disk) in /etc/hosts.
   '//disk/Public' is the cifs share name
   '/tmp/cifs' is where my automounts go (I have /tmp as RAM disk and / is read-only)
   '/tmp/cifs/disk' is a normal directory created when the server (called 'disk') is live.
   '/tmp/cifs/disk/Public' is the mount point for my 'Public' share.

3voto

haggai_e Points 2143
if mount | cut -d ' ' -f 3 | grep '^/mnt/disk$' > /dev/null ; then
   ...
fi

EDIT : J'ai utilisé l'idée de Bombe pour utiliser la coupe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X