Cómo verificar si un sistema de archivos está montado con un script

19

Soy nuevo en los scripts ... Puedo hacer cosas muy básicas, pero ahora necesito una mano.

Tengo un sistema de archivos local que solo se montará cuando necesite hacer una copia de seguridad.

Estoy empezando con esto.

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

Como dije, soy muy básico en las secuencias de comandos. Escuché que puedes verificar el estado del mountcomando mirando los códigos de retorno.

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

No sé cómo verificar eso. ¿Alguna orientación?

maniat1k
fuente
2
Tienes un colgante divertido ; thenen tu guión.
Mat
¿Por qué estamos exportando el MOUNT var y también eliminamos el ";"
Mike Q
Preguntas similares se encuentran en Falla del servidor , Desbordamiento de pila y Intercambio de pila de Unix y Linux .
Sasha

Respuestas:

19

Puede verificar el código de estado mounty los ejecutables más bien escritos con el parámetro especial de shell ?.

De man bash:

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

Después de ejecutar el mountcomando, la ejecución inmediata echo $?imprimirá el código de estado del comando anterior.

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

No todos los ejecutables tienen códigos de estado bien definidos. Como mínimo, debe salir con un código de éxito (0) o error (1), pero ese no es siempre el caso.

Para ampliar (y corregir) su script de ejemplo, agregué una ifconstrucción anidada para mayor claridad. No es la única forma de probar el código de estado y realizar una acción, pero es la más fácil de leer cuando se aprende.

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

Para obtener más información sobre "Estado de salida y salida", puede consultar la Guía avanzada de secuencias de comandos Bash .

George M
fuente
1
No hay necesidad de exportar $MOUNT. Este script también se romperá si el sistema de archivos tiene algún carácter que se someterá a la división de palabras (espacios, etc.). Usted debe siempre citar sus expansiones.
Chris Down
@ChrisDown Tienes razón. Solo eliminé el obvio colgante '; luego'. En el futuro, siéntase libre de editar mi respuesta para que sea más correcta.
George M
Er ... esto todavía se romperá. Todavía no has citado las expansiones. Por su consejo, lo haré ahora.
Chris Down
Tampoco recomendaría vincular a la infame guía de secuencias de comandos Bash "Avanzado", está llena de errores y enseñará a las personas a escribir errores, no guiones. BashGuide es una alternativa mucho mejor.
Chris Down
2
@ChrisDown "La división de palabras se comerá a sus bebés si no cita las cosas correctamente". Palabras por las cuales vivir.
George M
35

Muchas distribuciones de Linux tienen el mountpointcomando. Se puede usar explícitamente para verificar si un directorio es un punto de montaje. Tan simple como esto:

#!/bin/bash    
if mountpoint -q "$1"; then
    echo "$1 is a mountpoint"
else
    echo "$1 is not a mountpoint"
fi
asqueroso
fuente
1
Este enfoque fallará si intenta verificar un cifrado, ya que tropezará con un error de permiso denegado, cuando lo ejecute un usuario no root.
Denys S.
Mi solución funciona con encfs.
Theodore R. Smith
3

Una forma más:

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
Dom
fuente
Hola @sungtm; parece que has iniciado sesión con una cuenta nueva y separada. Como su cuenta "Sun" no tiene mucha actividad, le sugiero que continúe usando su nueva cuenta "sungtm" , ya que es más simple. Sin embargo, si desea fusionar las cuentas, hágamelo saber marcando este comentario y nos comunicaremos con el equipo de Stack Exchange. ¡Gracias!
Jeff Schaller
Tenga en cuenta que para encfs, findmntdebe suministrarse con el parámetro --source encfs; de lo contrario, siempre considerará que el directorio se debe montar, ya que recae en el montaje principal.
Burkart
2

La forma más fácil que no requiere root es:

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

fi

o para ver si no está montado:

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

fi
Theodore R. Smith
fuente
el mountcomando no necesita acceso a la raíz, dfse centra en el espacio del disco, no en los puntos de montaje ...
Philippe Gachoud
1

Declaraciones cortas

Compruebe si está montado :

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

Verificar si no está montado :

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

He intentado con el siguiente script

#!/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 única entrada que necesita dar es el nombre del sistema de archivos

Praveen Kumar BS
fuente