GNU/Linux >> Tutoriels Linux >  >> Linux

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

Solution 1 :

Évitez d'utiliser /etc/mtab car il peut être incohérent.

Éviter les tuyauteries mount parce que ça 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 de faire correspondre par ex. /mnt/foo-bar .)

Solution 2 :

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

ou

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

Solution 3 :

findmnt -rno SOURCE,TARGET "$1" évite tous les problèmes dans les autres réponses. Il fait proprement le travail avec une seule commande.

Les autres approches présentent les inconvénients suivants :

  • 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. (mountpoint est également basé sur proc).
  • mountinfo est basé sur /proc/..
  • cut -f3 -d' ' perturbe les espaces dans les noms de chemin
  • Analyse de montage L'espace blanc de est problématique. Sa page de manuel indique maintenant :

.. le mode de liste est maintenu uniquement pour la rétrocompatibilité.

Pour une sortie plus robuste et personnalisable, utilisez findmnt (8), notamment 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

Solution 4 :

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 à moins de choses comme /proc (non portable), il ne vous donnera jamais de réponse claire.

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 donne des informations utiles.

Solution 5 :

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 si ce n'est pas le cas (cela peut échouer car le disque se trouve 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..

  if ! grep -q /backup /proc/mounts ; then
    if ! mount /backup ; then
      echo "failed"
      exit 1
    fi
  fi
  echo "suceeded."
  # do stuff here

Linux
  1. La meilleure façon de détecter (à partir d'un script) si un logiciel est installé ?

  2. N'importe quel moyen de quitter le script bash, mais sans quitter le terminal

  3. Portée variable pour les scripts shell bash et les fonctions dans le script

  4. Je viens de supprimer /bin. Quelle est la meilleure façon de récupérer ?

  5. Quelle est la meilleure façon de définir une variable d'environnement dans .bashrc ?

Quelle est la différence entre exécuter un script Bash et le sourcer ?

Vérifiez si l'un des paramètres d'un script bash correspond à une chaîne

Quelle est la meilleure façon de joindre à nouveau des fichiers après les avoir divisés ?

Quelle est la meilleure façon d'apprendre SELinux ?

Quel est le moyen le plus sûr et le plus portable d'invoquer le binaire echo ?

Quel est le moyen le plus rapide d'exécuter un script ?