Quelle est la meilleure façon 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
Évitez d'utiliser /etc/mtab
car il peut être incohérent.
Évitez la tuyauterie mount
car cela n'a pas besoin d'être si compliqué.
Simplement:
if grep -qs '/mnt/foo ' /proc/mounts; then
echo "It's mounted."
else
echo "It's not mounted."
fi
(L'espace après le /mnt/foo
est d'éviter la correspondance, par exemple /mnt/foo-bar
.)
if mountpoint -q /mnt/foo
then
echo "mounted"
else
echo "not mounted"
fi
ou
mountpoint -q /mnt/foo && echo "mounted" || echo "not mounted"
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
et grep -s
sont une étape supplémentaire inutile et ne sont pas pris en charge partout./proc/\*
n'est pas pris en charge partout.mountinfo
est basé sur/proc/..cut -f3 -d' '
gâche les espaces dans les noms de chemin.. le mode de listage est maintenu pour la compatibilité descendante uniquement.
Pour une sortie plus robuste et personnalisable, utilisez findmnt (8), en particulier dans vos scripts.
Fonctions Bash:
#These functions return exit codes: 0 = found, 1 = not found
isMounted () { findmnt -rno SOURCE,TARGET "$1" >/dev/null;} #path or device
isDevMounted () { findmnt -rno SOURCE "$1" >/dev/null;} #device only
isPathMounted() { findmnt -rno TARGET "$1" >/dev/null;} #path only
#where: -r = --raw, -n = --noheadings, -o = --output
Exemples d'utilisation:
if isPathMounted "/mnt/foo bar"; #Spaces in path names are ok.
then echo "path is mounted"
else echo "path is not mounted"
fi
if isDevMounted "/dev/sdb4";
then echo "device is mounted"
else echo "device is not mounted"
fi
#Universal:
if isMounted "/mnt/foo bar";
then echo "device is mounted"
else echo "device is not mounted"
fi
if isMounted "/dev/sdb4";
then echo "device is mounted"
else echo "device is not mounted"
fi
Un script comme celui-ci ne sera jamais portable. Un sale secret sous Unix est que seul le noyau sait où se trouvent les systèmes de fichiers, et à court de choses comme/proc (non portable), il ne vous donnera jamais de réponse directe.
J'utilise généralement df pour découvrir quel est le point de montage d'un sous-répertoire et dans quel système de fichiers il se trouve.
Par exemple (nécessite un shell Posix comme ash/AT&T ksh/bash/etc)
case $(df $mount)
in
$(df /)) echo $mount is not mounted ;;
*) echo $mount has a non-root filesystem mounted on it ;;
esac
Kinda vous dit des informations utiles.
ce qui suit est ce que j'utilise dans l'un de mes cron-jobs de sauvegarde rsync. il vérifie si/backup est monté et essaie de le monter s'il ne l'est pas (il peut échouer car le lecteur est dans une baie remplaçable à chaud et peut même ne pas être présent dans le système)
REMARQUE: ce qui suit ne fonctionne que sur Linux, car il greps/proc/mounts - une version plus portable exécuterait 'mount | grep/backup ', comme dans la réponse de Matthew ..
si ! grep -q/backup/proc/mounts; puis si ! montage/sauvegarde; puis écho "a échoué" sortie 1 fi fi écho "a réussi." # fais des trucs ici
Étant donné que pour monter, vous devez avoir un répertoire là-bas de toute façon, qui est monté, ma stratégie a toujours été de créer un faux fichier avec un nom de fichier étrange qui ne serait jamais utilisé, et de simplement vérifier son existence. Si le dossier était là, alors rien n'était monté à cet endroit ...
Je ne pense pas que cela fonctionne pour le montage de lecteurs réseau ou des choses comme ça. Je l'ai utilisé pour les lecteurs flash.
Que diriez-vous de comparer les numéros d'appareils? J'essayais juste de penser à la façon la plus ésotérique ..
#!/bin/bash
if [[ $(stat -c "%d" /mnt) -ne $(stat -c "%d" /mnt/foo) ]]; then
echo "Somethin mounted there I reckon"
fi
Il y a un défaut dans ma logique avec ça ...
En tant que fonction:
#!/usr/bin/bash
function somethingMounted {
mountpoint="$1"
if ! device1=$(stat -c "%d" $mountpoint); then
echo "Error on stat of mount point, maybe file doesn't exist?" 1>&2
return 1
fi
if ! device2=$(stat -c "%d" $mountpoint/..); then
echo "Error on stat one level up from mount point, maybe file doesn't exist?" 1>&2
return 1
fi
if [[ $device1 -ne $device2 ]]; then
#echo "Somethin mounted there I reckon"
return 0
else
#echo "Nothin mounted it seems"
return 1
fi
}
if somethingMounted /tmp; then
echo "Yup"
fi
Les messages d'erreur d'écho sont probablement redondants, car stat affichera également une erreur.
Désolé d'avoir soulevé cette question, mais je pense que c'est assez utile:
if awk '{print $2}' /proc/mounts | grep -qs "^/backup$"; then
echo "It's mounted."
else
echo "It's not mounted."
fi
Ceci obtient la 2ème colonne de/proc/mounts (2ème colonne = points de montage).
Ensuite, il récupère la sortie. Notez les ^ et $, cela empêche/backup de correspondre à/mnt/backup ou/backup-old etc.
Aucun de ceux-ci ne satisfait le 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 sur Host:/real_thing. Utiliser grep à cet effet 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 votée ici n'est en fait PAS "la meilleure façon 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:
dev=`df -P /thing/thingy | awk 'BEGIN {e=1} $NF ~ /^\/.+/ { e=0 ; print $1 ; exit } END { exit e }'` && {
echo "Mounted via: $dev"
} || {
echo "Not mounted"
}
La sortie de l'exécution de ceci sera:
Mounted via: Host:/real_thing
Si vous voulez savoir quel est le vrai point de montage, pas de problème:
mp=`df -P /thing/thingy | awk 'BEGIN {e=1} $NF ~ /^\/.+/ { e=0 ; print $NF ; exit } END { exit e }'` && {
echo "Mounted on: $mp"
} || {
echo "Not mounted"
}
La sortie de cette commande sera:
Mounted on: /thing
Tout cela 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, dans le chroot, via un répertoire ou une liste de fichiers arbitraire.
Cela dépend de ce que vous savez sur le volume que vous recherchez.
Dans le cas particulier que j'ai récemment recherché, où je voulais savoir 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 hautement portable; cela fonctionne sur de nombreuses distributions Linux modernes, cependant, et la question a été balisée pour Linux, et c'est une approche complètement différente de tout ce qui a été mentionné jusqu'à présent, ce qui élargit les possibilités.)
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 vraiment voulez savoir, c'est "est-ce que 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
Bien que ce soit une question Linux, pourquoi ne pas le rendre portable quand cela se fait facilement?
La page de manuel de grep
dit:
Les scripts Shell portables devraient éviter à la fois -q et -s et devraient rediriger la sortie standard et d'erreur vers
/dev/null
au lieu.
Je propose donc la solution suivante:
if grep /mnt/foo /proc/mounts > /dev/null 2>&1; then
echo "Mounted"
else
echo "NOT mounted"
fi
grep/etc/mtab pour votre point de montage peut-être?
Doit-il être plus compliqué que cela?
mount \
| cut -f 3 -d ' ' \
| grep -q /mnt/foo \
&& echo "mounted" || echo "not mounted"
Cette?:
volume="/media/storage"
if mount|grep $volume; then
echo "mounted"
else
echo "not mounted"
if
De: n forum Ubunt
Créez un fichier sous votre point de montage comme check_mount
et puis juste tester si elle existe?
if [[ -f /something/check_mount ]]; then
echo "Mounted
RC=$?
else
Echo "Not mounted"
RC=0
fi
exit $RC