Quel est le meilleur moyen de vérifier si un volume est monté dans un script Bash?
Ce que j'aimerais vraiment, c'est une méthode que je peux utiliser comme ceci:
if <something is mounted at /mnt/foo>
then
<Do some stuff>
else
<Do some different stuff>
fi
/etc/mtab
,/proc/mounts
sont liés à/proc/self/mounts
. (au moins sur Fedora 20 il est)Réponses:
Évitez d'utiliser
/etc/mtab
parce que cela peut être incohérent.Évitez les tuyaux
mount
car ils ne doivent pas nécessairement être compliqués.Simplement:
(L'espace après le
/mnt/foo
est d'éviter de faire correspondre par exemple/mnt/foo-bar
.)la source
ou
la source
mountpoint
provient du paquet "initscripts" dans Ubuntu / Debian.mountpoint
est qu’il vérifie, en fait, si un point de montage est monté, mais pas si un périphérique est monté. Si un périphérique est passé avec l'-x
option, il vous indique le numéro de périphérique majeur / mineur, mais pas s'il est monté.util-linux
findmnt -rno SOURCE,TARGET "$1"
évite tous les problèmes dans les autres réponses. Il fait proprement le travail avec une seule commande.D'autres approches ont ces inconvénients:
grep -q
etgrep -s
sont une étape supplémentaire inutile et ne sont pas pris en charge partout./proc/\*
n'est pas supporté partout.mountinfo
est basé sur / proc / ..cut -f3 -d' '
gâche les espaces dans les noms de cheminsFonctions Bash:
Exemples d'utilisation:
la source
findmnt(8)
commande mais je n'ai jamais vraiment joué avec. Franchement, si je mettais à jour certains de mes scripts qui font ce genre de choses (ou en créons de nouveaux) sur une machine Linux (ou lorsque la commande est disponible), c’est ce que je ferais.findmnt
doit être fourni avec le paramètre--source encfs
, sinon il considérera toujours que le répertoire est monté car il revient au montage parent.grep
solution car si un chemin de montage est étrange, vous pouvez obtenir des faux positifs: par exemple, si je monte/dev/mmcblk0p1
dessus~/mnt/dev/sda1
, je risque de ne pas utiliser la chose/dev/sda1
montée par la commandemount | grep '/dev/sda1'
. Je ne peux pas obtenir un faux positif en utilisantfindmnt
. Bonne réponse!Un script comme celui-ci ne sera jamais portable. Un sale secret sous Unix est que seul le noyau sait quels systèmes de fichiers se trouvent où et, à part des choses comme / proc (non portable), il ne vous donnera jamais de réponse directe.
J'utilise généralement df pour découvrir le point de montage d'un sous-répertoire et son système de fichiers.
Par exemple (nécessite un shell posix comme cendres / AT & T ksh / bash / etc)
Kinda vous dit des informations utiles.
la source
Voici ce que j'utilise dans l'un de mes travaux cron de sauvegarde rsync. il vérifie si / backup est monté et essaie de le monter s'il ne l'est pas (cela peut échouer car le lecteur se trouve dans une baie remplaçable à chaud et peut même ne pas être présent dans le système)
NOTE: Ce qui suit ne marche que sur linux, car il contient greps / proc / mounts - une version plus portable exécutera 'mount | grep / backup ', comme dans la réponse de Matthew ..
la source
grep -q ' /backup ' /proc/mounts
oumount | grep -q ' /backup '
. Ou redirigez vers / dev / null si votre grep ne supporte pas-q
(ce qui est dans les spécifications POSIX pour grep de nos jours).Comme pour monter, vous devez de toute façon avoir un répertoire, qui est monté dessus, ma stratégie a toujours été de créer un faux fichier avec un nom de fichier étrange qui ne serait jamais utilisé, et juste de vérifier son existence. Si le fichier était là, rien n'était monté à cet endroit ...
Je ne pense pas que cela fonctionne pour monter des lecteurs réseau ou des choses comme ça. Je l'ai utilisé pour les lecteurs flash.
la source
Que diriez-vous de comparer les numéros d'appareils? J'essayais juste de penser à la manière la plus ésotérique ..
Il y a un défaut dans ma logique avec ça ...
En tant que fonction:
Les messages d'erreur echo sont probablement redondants, car stat affichera également une erreur.
la source
Aucune de celles-ci ne convient au cas d'utilisation où un répertoire donné est un sous-répertoire dans un autre point de montage. Par exemple, vous pourriez avoir / thing qui est un montage NFS à héberger: / real_thing. Utiliser grep à cette fin sur / proc / mounts / etc / mtab ou 'mount' ne fonctionnera pas, car vous rechercherez un point de montage qui n'existe pas. Par exemple, / thing / thingy n'est pas un point de montage, mais / thing est monté sur l'hôte: / real_thing. La meilleure réponse mise ici n'est pas "le meilleur moyen de déterminer si un répertoire / volume est monté". Je voterais en faveur de l'utilisation de 'df -P' (mode standard -P POSIX) comme stratégie plus propre:
Le résultat de l’exécution sera:
Si vous voulez savoir quel est le véritable point de montage, pas de problème:
Le résultat de cette commande sera:
Ceci est très utile si vous essayez de créer une sorte de chroot qui reflète les points de montage en dehors du chroot, au sein du chroot, via un répertoire ou une liste de fichiers arbitraire.
la source
Désolé d'avoir soulevé cette question, mais je pense que c'est très utile:
Cela donne la 2e colonne de / proc / mounts (2e colonne = points de montage).
Ensuite, il affiche la sortie. Notez que ^ et $, cela empêche / backup de faire correspondre / mnt / backup ou / backup-old etc.
la source
grep / etc / mtab pour votre point de montage peut-être?
la source
Cette?:
De: un forum Ubuntu
la source
Bien que ce soit une question Linux, pourquoi ne pas le rendre portable quand il est facile à faire?
La page de manuel de
grep
dit:Je propose donc la solution suivante:
la source
-q
et-s
sont spécifiés par POSIX donc il ne devrait pas y avoir de problème de portabilité avec elle de toute façon (maintenant sinon avant - je ne l' ai pas gardé la trace des changements qui se produit quand).Cela doit-il être plus compliqué que cela?
la source
grep -q /mnt/foo
sera également correspondre à des points de montage/mnt/food
et/not/mnt/foo
... Que diriez-vousgrep -qx /mnt/foo
?-x
fait correspondre grep uniquement si la ligne entière correspond.cut -f 3 -d ' '
trébuche quand le chemin de montage a un espace dans un nom de fichier.Tout dépend de ce que vous savez sur le volume que vous recherchez.
Dans le cas particulier que j'ai étudié récemment, où je me demandais si un lecteur flash particulier était monté, ce qui fonctionne le plus facilement est de vérifier l'existence de / dev / disks / by-label /. Si le périphérique est branché, les scripts udev s'assurent que le lien existe (et qu'il est supprimé lorsque le périphérique est débranché).
(Ce n'est PAS une réponse très portable; cela fonctionne sur de nombreuses distributions Linux modernes, cependant, et la question a été étiquetée pour Linux, et c'est une approche complètement différente de tout ce qui a été mentionné jusqu'ici, de sorte qu'elle élargit les possibilités.)
la source
Créer un fichier sous votre point de montage comme
check_mount
et ensuite juste tester s'il existe?la source
Je devais le faire dans Chef pour idempotence car, lorsque chef-client s'exécutait, l'exécution échouait en raison du volume déjà monté. Au moment où j'écris ceci, la
mount
ressource Chef avait une sorte de bogue qui ne fonctionnait pas avec les attributs comme je le souhaitais. J'ai donc monté le volume à l'aide de laexecute
ressource. Voici comment je l'ai fait:En cas de confusion, dans mon fichier d'attributs, j'ai les éléments suivants:
Le
if not node['docker-server']['mountpoint'] == "none"
fait partie d'unecase
instruction où, si le point de montage sur le serveur n'est pas spécifié, le point de montage par défaut estnone
.la source