Pregunta ¿Cuál es la mejor manera de verificar si un volumen está montado en un script de Bash?


¿Cuál es la mejor manera de verificar si un volumen está montado en un script de Bash?

Lo que realmente me gustaría es un método que pueda usar así:

if <something is mounted at /mnt/foo> 
then
   <Do some stuff>
else
   <Do some different stuff>
fi

90
2017-08-05 20:16


origen


Estaba a punto de escribir un guión para hacer esto yo mismo. Mi primer pensamiento es obtener información de / etc / mtab, pero aún no he hojeado mis libros de bash para ver si hay una manera más directa. - 3dinfluence
@ 3dinfluence - sí, lo sé desde hace mucho tiempo, pero /etc/mtab, /proc/mounts están vinculados a /proc/self/mounts. (Al menos en Fedora 20 lo es) - Wilf


Respuestas:


Evitar el uso de /etc/mtab porque puede ser inconsistente

Evitar la tubería mount Porque no tiene por qué ser tan complicado.

Simplemente:

if grep -qs '/mnt/foo ' /proc/mounts; then
    echo "It's mounted."
else
    echo "It's not mounted."
fi

(El espacio después de la /mnt/foo es evitar el emparejamiento por ej. /mnt/foo-bar.)


103
2017-08-05 20:27



Sin mencionar, una llamada para montar puede colgar si el punto de montaje está encajado. - Chad Huneycutt
Bueno para Linux, no para freebsd o solaris. - chris
Esto es cierto, Chris. Aunque la pregunta fue etiquetada linux. - Dan Carley
Supongo que esta es una pregunta filosófica: ¿deberíamos intentar hacer que las cosas sean portátiles si es posible o simplemente deberíamos suponer que todas las ventanas / linux del mundo funcionan y actuar en consecuencia? - chris
En realidad, deberías probar para '/ mnt / foo', es decir. con un espacio o puede obtener un falso positivo si ha montado un volumen llamado por ejemplo. 'fooks'. Acabo de tener ese problema con dos puntos de montaje, 'lmde' y 'lmde-home'. - marlar


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

o

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

53
2018-01-04 08:33



Solo para información: mountpoint se origina en el paquete "initscripts" en Ubuntu / Debian. - blueyed
No funcionó para mí - :-( - Wilf
Este es el llamado, que mi vagabundo se aferra. - dhill
El problema con mountpoint es que comprueba, de hecho, si un punto de montaje está montado, pero no si un dispositivo está montado. Si se pasa un dispositivo con la -x opción le indica el número de dispositivo mayor / menor, pero no si está montado. - vegatripy


Un guión como este nunca será portátil. Un secreto sucio en Unix es que solo el kernel sabe qué sistemas de archivos están donde, y por debajo de cosas como / proc (no portátil) nunca le dará una respuesta directa.

Normalmente uso df para descubrir cuál es el punto de montaje de un subdirectorio y en qué sistema de archivos se encuentra.

Por ejemplo (requiere shell posix como 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 te da información útil.


6
2017-08-05 20:32



La pregunta está etiquetada como Linux, por lo que quizás no tenga que ser portátil. - Rory


lo siguiente es lo que uso en una de mis tareas cron de copia de seguridad rsync. verifica si / backup está montado, e intenta montarlo si no lo está (puede fallar porque la unidad está en una bahía de intercambio en caliente y puede que ni siquiera esté presente en el sistema)

NOTA: lo siguiente solo funciona en linux, ya que grita / proc / mounts - una versión más portátil ejecutaría 'mount | grep / backup ', como en la respuesta de Matthew ..

  Si ! grep -q / backup / proc / mounts; entonces
    Si ! montaje / copia de seguridad; entonces
      echo "fallido"
      salida 1
    fi
  fi
  echo "suceeded".
  # hacer cosas aquí

6
2017-08-05 20:39



Upvoted como una buena alternativa de control de cordura. - Dan Carley
Presumiblemente este método se encuentra con los mismos problemas que la respuesta de Matthew Bloch. - mwfearnley
Sí, excepto por el problema del espacio en el nombre de archivo mencionado por "Vista elíptica" (esto se extiende a toda la línea, no solo a un campo extraído). El problema de las sub-cadenas no es un gran problema a menos que de alguna manera olvides que citar argumentos es algo que puedes hacer. p.ej. grep -q ' /backup ' /proc/mounts o mount | grep -q ' /backup '. O redirige a / dev / null si tu grep no es compatible -q (cual es en la especificación POSIX para grep en estos días). - cas


findmnt -rno SOURCE,TARGET "$1" Evita todos los problemas en las otras respuestas. Limpiamente hace el trabajo con un solo comando.


Otros enfoques tienen estas desventajas:

  • Análisis montarEl espacio en blanco es problemático. Es la página de manual ahora dice:

.. el modo de listado se mantiene solo por compatibilidad hacia atrás.

Para un uso más robusto y personalizable. encontrar(8), especialmente en tus guiones.


  • grep -q y grep -s Son un paso innecesario y no están soportados en todas partes.
  • /proc/\* no es compatible en todas partes.
  • mountinfo se basa en / proc / ..
  • cut -f3 -d' ' desordena los espacios en los nombres de ruta

Funciones:

#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

Ejemplos de uso:

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

5
2018-03-15 16:42



Para Linux específico de todos modos este es realmente el mejor enfoque. He visto el findmnt(8) comando pero nunca jugué realmente con él. Francamente, si tuviera que actualizar algunos de mis scripts que hacen este tipo de cosas (o hacer nuevas) en una caja de Linux (o donde el comando está disponible), esto es lo que haría. - Pryftan


Ya que para montar, necesitas tener un directorio allí de todos modos, eso se monta, mi estrategia siempre fue crear un archivo falso con un nombre de archivo extraño que nunca se usaría, y solo verificar su existencia. Si el archivo estaba allí, entonces no se montó nada en ese lugar ...

No creo que esto funcione para montar unidades de red o cosas así. Lo utilicé para unidades flash.


2
2017-08-05 20:36





¿Qué hay de comparar números de dispositivos? Solo estaba tratando de pensar en lo más esotérico camino..

#!/bin/bash
if [[ $(stat -c "%d" /mnt) -ne $(stat -c "%d" /mnt/foo) ]]; then
    echo "Somethin mounted there I reckon"
fi

Hay una falla en mi lógica con eso ...

Como una función:

#!/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

Los mensajes de error de eco son probablemente redundantes, porque stat también mostrará un error.


2
2017-08-05 20:57



En realidad, probablemente tendría que verificar primero el estado de salida de stat para cada llamada para asegurarse de que el archivo esté allí ... no tan novedoso como pensaba :-( - Kyle Brandt♦


Ninguno de estos satisface el caso de uso donde un directorio dado es un subdirectorio dentro de otro punto de montaje. Por ejemplo, puede tener / thing que es un montaje NFS para alojar: / real_thing. El uso de grep para este propósito en / proc / mounts / etc / mtab o 'mount' no funcionará, porque buscará un punto de montaje que no exista. Por ejemplo, / thing / thingy no es un punto de montaje, pero / thing está montado en el host: / real_thing. La mejor respuesta votada aquí en realidad NO es "la mejor manera de determinar si un directorio / volumen está montado". Votaría a favor usando 'df -P' (modo de estándares POSIX-P) como una estrategia más limpia:

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 salida de ejecutar esto será:

Mounted via: host:/real_thing

Si desea saber cuál es el punto de montaje real, no hay problema:

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 salida de ese comando será:

Mounted on: /thing

Todo esto es muy útil si está intentando crear algún tipo de chroot que refleje los puntos de montaje fuera del chroot, dentro de un chroot, a través de algún directorio o lista de archivos arbitrarios.


1
2017-10-24 13:59





Lo siento por hablar de esto, pero creo que esto es bastante útil:

if awk '{print $2}' /proc/mounts | grep -qs "^/backup$"; then
    echo "It's mounted."
else
    echo "It's not mounted."
fi

Esto obtiene la 2ª columna de / proc / mounts (2ª columna = puntos de montaje).

Entonces agarra la salida. Tenga en cuenta que ^ y $, esto evita que / backup coincida con / mnt / backup o / backup-old, etc.


1
2018-03-27 15:59





grep / etc / mtab para su punto de montaje tal vez?


0
2017-08-05 20:21



mtab puede estar desactualizado o simplemente no ser actualizado por el montaje, como cuando se usa mount -n porque / es de solo lectura. - chris
Estoy de acuerdo, pero ese parecía ser el primer lugar para empezar a buscar. - Ophidian


¿Esta?:

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

Desde: Un foro de Ubuntu


0
2017-08-05 20:28