web-dev-qa-db-fra.com

Quelle est la meilleure façon de vérifier si un volume est monté dans un script Bash?

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
109
Mark Biek

É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.)

122
Dan Carley
if mountpoint -q /mnt/foo 
then
   echo "mounted"
else
   echo "not mounted"
fi

ou

mountpoint -q /mnt/foo && echo "mounted" || echo "not mounted"
61
Zaptac

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
  • Analyser l'espace blanc de mount est problématique. Sa page de manuel dit maintenant:

.. 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
21
Elliptical view

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.

7
chris

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 
6
cas

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

2
Brian Postow

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.

2
Kyle Brandt

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.

1
David

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.

1
Craig

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

0

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
0
Bruno Bronosky

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
0
fex

grep/etc/mtab pour votre point de montage peut-être?

0
Ophidian

Doit-il être plus compliqué que cela?

mount \
    | cut -f 3 -d ' ' \
    | grep -q /mnt/foo \
  && echo "mounted" || echo "not mounted"
0
Matthew Bloch

Cette?:

volume="/media/storage"
if mount|grep $volume; then
echo "mounted"
else
echo "not mounted"
if

De: n forum Ubunt

0
RateControl

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
0
Wiljami