Comment vérifier si un système de fichiers est monté avec un script


19

Je suis nouveau dans les scripts ... Je peux faire des trucs très basiques, mais maintenant j'ai besoin d'un coup de main.

J'ai un système de fichiers local qui ne sera monté que lorsque je devrai faire une sauvegarde.

Je commence par ça.

#!/bin/bash
export MOUNT=/myfilesystem

if grep -qs $MOUNT /proc/mounts; then
  echo "It's mounted."
else
  echo "It's not mounted."; then
  mount $MOUNT;
fi

Comme je l'ai dit, je suis très basique en script. J'ai entendu dire que vous pouvez vérifier l'état de la mountcommande en consultant les codes retour.

RETURN CODES
       mount has the following return codes (the bits can be ORed):
       0      success
       1      incorrect invocation or permissions
       2      system error (out of memory, cannot fork, no more loop devices)
       4      internal mount bug
       8      user interrupt
       16     problems writing or locking /etc/mtab
       32     mount failure
       64     some mount succeeded

Je ne sais pas comment vérifier ça. Des conseils?


2
Vous avez un drôle de balancement ; thendans votre script.
Mat

pourquoi exportons-nous la var MOUNT et supprimons également le ";"
Mike Q

Des questions similaires concernent la défaillance du serveur , le débordement de pile et l' échange de pile Unix et Linux .
sasha

Réponses:


19

Vous pouvez vérifier le code d'état mountet les exécutables les mieux écrits avec le paramètre spécial shell ?.

De man bash:

? Expands to the exit status of the most recently executed foreground pipeline.

Après avoir exécuté la mountcommande, l'exécution immédiate echo $?affichera le code d'état de la commande précédente.

# mount /dev/dvd1 /mnt
  mount: no medium found on /dev/sr0
# echo $?
  32

Tous les exécutables n'ont pas de codes d'état bien définis. Au minimum, il devrait sortir avec un code de réussite (0) ou d'échec (1), mais ce n'est pas toujours le cas.

Pour développer (et corriger) votre exemple de script, j'ai ajouté une ifconstruction imbriquée pour plus de clarté. Ce n'est pas le seul moyen de tester le code d'état et d'effectuer une action, mais c'est le plus facile à lire lors de l'apprentissage.

#!/bin/bash
mount="/myfilesystem"

if grep -qs "$mount" /proc/mounts; then
  echo "It's mounted."
else
  echo "It's not mounted."
  mount "$mount"
  if [ $? -eq 0 ]; then
   echo "Mount success!"
  else
   echo "Something went wrong with the mount..."
  fi
fi

Pour plus d'informations sur "Exit and Exit Status", vous pouvez vous référer au Guide avancé de Bash-Scripting .


1
Il n'est pas nécessaire d'exporter $MOUNT. Ce script se brisera également si le système de fichiers a un caractère qui subirait un fractionnement de mots (espaces, etc.). Vous devez toujours citer vos extensions.
Chris Down

@ChrisDown Vous avez raison. Je n'ai supprimé que les pendants évidents "; puis". À l'avenir, n'hésitez pas à modifier ma réponse pour la rendre plus correcte.
George M

Euh ... ça va encore casser. Vous n'avez toujours pas cité les extensions. Sur votre conseil, je vais le faire maintenant.
Chris Down

Je ne recommanderais pas non plus de créer un lien vers le fameux guide de script Bash "avancé", il est plein d'erreurs et apprendra aux gens à écrire des bogues, pas des scripts. BashGuide est une bien meilleure alternative.
Chris Down

2
@ChrisDown "Le fractionnement de mots mangera vos bébés si vous ne citez pas les choses correctement." Des mots pour vivre.
George M

35

De nombreuses distributions Linux ont la mountpointcommande. Il peut explicitement être utilisé pour vérifier si un répertoire est un point de montage. Aussi simple que cela:

#!/bin/bash    
if mountpoint -q "$1"; then
    echo "$1 is a mountpoint"
else
    echo "$1 is not a mountpoint"
fi

1
Cette approche échouera si vous essayez de vérifier un encfs, car vous tomberez sur une erreur d'autorisation refusée, lorsqu'elle sera exécutée par un utilisateur non root.
Denys S.

Ma solution fonctionne avec encfs.
Theodore R. Smith,

3

Encore une façon:

if findmnt ${mount_point}) >/dev/null 2>&1 ; then
  #Do something for positive result (exit 0)
else
  #Do something for negative result (exit 1)
fi

Bonjour @sungtm; il semble que vous vous soyez connecté avec un nouveau compte distinct. Puisque votre compte "Sun" n'a pas beaucoup d'activité, je vous suggère de continuer à utiliser votre nouveau compte "sungtm" , car c'est plus simple. Si, toutefois, vous souhaitez fusionner les comptes, faites-le moi savoir en signalant ce commentaire et nous contacterons l'équipe Stack Exchange. Je vous remercie!
Jeff Schaller

Notez que pour encfs, findmntdoit être fourni avec le paramètre --source encfs, sinon il considérera toujours le répertoire à monter car il revient au montage parent.
Burkart

2

Le moyen le plus simple qui ne nécessite pas de root est:

if $(df | grep -q /mnt/ramdisk); then

fi

ou pour voir s'il n'est pas monté:

if ! $(df | grep -q /mnt/ramdisk); then

fi

la mountcommande n'a pas besoin d'un accès root, elle dfse concentre sur l'espace disque et non sur les points de montage ...
Philippe Gachoud

1

courtes déclarations

Vérifiez si monté :

mount|grep -q "/mnt/data" && echo "/mnt/data is mounted; I can follow my job!"

Vérifier si non monté :

mount|grep -q "/mnt/data" || echo "/mnt/data is not mounted I could probably mount it!"

0

J'ai essayé avec le script ci-dessous

#!/bin/bash
echo "enter the file system to check whether its mounted or not"
read p
echo $p
for i in `cat /proc/mounts`
do
if [[ $p =~ $i ]]
then
echo "$p is mounted"
else
echo "$p is not mounted"
fi
done

La seule entrée que vous devez donner est le nom du système de fichiers

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.