Compruebe si el directorio está montado con bash

94

estoy usando

mount -o bind /some/directory/here /foo/bar

Quiero comprobarlo /foo/barcon un script bash y ver si se ha montado. Si no es así, llame al comando de montaje anterior, de lo contrario, haga otra cosa. ¿Cómo puedo hacer esto?

CentOS es el sistema operativo.

Justin
fuente
algo como "si [[$ (mount -l ... | fgrep ... | wc -l)]]; entonces ..."
bobah
Preguntas similares están en Server Fault , Stack Overflow y Unix & Linux Stack Exchange .
Sasha

Respuestas:

69

Ejecutar el mountcomando sin argumentos le dirá los montajes actuales. Desde un script de shell, puede verificar el punto de montaje con grepuna instrucción if:

if mount | grep /mnt/md0 > /dev/null; then
    echo "yay"
else
    echo "nay"
fi

En mi ejemplo, la sentencia if está verificando el código de salida de grep, que indica si hubo una coincidencia. Como no quiero que se muestre la salida cuando hay una coincidencia, la estoy redirigiendo a /dev/null.

Christopher Neylan
fuente
4
No es necesario verificar si devuelve una cadena. grepdevuelve un estado de salida distinto de cero si no hay coincidencias. No es necesario realizar la prueba o la subcapa creada por $ (). if command | grep -q 'stuff'; then ...
jordanm
32
Esto no funciona con mount bind y, por lo tanto, no debe aceptarse como respuesta. Esta respuesta debería rechazarse. No puedes depender de mount | grep ...mostrarte que tu enlace de montura todavía está activo. Si el dispositivo subyacente se desmonta y se vuelve a montar, el enlace de montaje ya no conectará los dos archivos / directorios aunque mounttodavía muestre que está conectado. Y si lo haces umount ...incluso te dirá que no está montado, aunque mountdijo que sí. ENORME falla en el sistema de archivos de Linux.
Dev Null
@DevNull: Estoy teniendo exactamente el problema que describiste. Alguna solución a este problema?
Isaac
@Isaac, perdón por la demora en la respuesta. Intentaría usar readlink -f, que no devuelve nada cuando la ruta / archivo no existe. Si el / mount / path / to_file subyacente no está allí (por vínculo de lectura), el montaje subyacente está roto (vuelva a montar el montaje subyacente y el enlace). Si el archivo subyacente está allí y readlink -fdice que la versión de enlace de ese archivo no está allí, el enlace está roto, simplemente vuelva a montar el enlace.
Dev Null
2
Si hay un montaje llamado, /mnt/md0xxxel comando indicará /mnt/md0como montado, mientras que lo que no tiene que ser ...
David L.
179

No te molestaste en mencionar un O / S.

Ubuntu Linux 11.10 (y probablemente las versiones más actualizadas de Linux) tienen el mountpointcomando.

Aquí hay un ejemplo en uno de mis servidores:

$ mountpoint /oracle
/oracle is a mountpoint
$ mountpoint /bin
/bin is not a mountpoint

En realidad, en su caso, debería poder usar la -qopción, así:

mountpoint -q /foo/bar || mount -o bind /some/directory/here /foo/bar

Espero que ayude.

Mark J. Bobak
fuente
7
¿De verdad tiene algo montado en el momento en que ejecutó el comando 'mountpoint'? Incluso si está destinado a ser un punto de montaje, a menos que realmente tenga algo montado, es solo un directorio.
Mark J. Bobak
2
+1, también funciona en Ubuntu 10.10. Ha estado en Ubuntu desde 8.04 .
l0b0
3
mountpoint también está presente en RHEL 6.3 (probablemente incluso en versiones anteriores)
Joril
2
mountpoint está presente y funciona perfectamente en Debian 7 ("Wheezy") y UCS 4 también
Lahmizzar
7
Como se mencionó en otro comentario, el punto de montaje no funciona con los montajes de enlace. El fragmento montará el directorio varias veces
csanchez
41

El manual de mountpointdice que:

comprueba si el directorio o archivo dado se menciona en el archivo / proc / self / mountinfo.

El manual de mountdice que:

El modo de listado se mantiene solo por compatibilidad con versiones anteriores. Para una salida más robusta y personalizable, use findmnt (8), especialmente en sus scripts.

Entonces, el comando correcto a usar esfindmnt , que es en sí mismo parte del util-linuxpaquete y, de acuerdo con el manual:

puede buscar en / etc / fstab, / etc / mtab o / proc / self / mountinfo

Entonces, en realidad, busca más cosas que mountpoint. También proporciona la opción conveniente:

-M, - ruta del punto de montaje

Defina explícitamente el archivo o directorio de punto de montaje. Consulte también --target.

En resumen, para verificar si un directorio está montado con bash, puede usar:

if [[ $(findmnt -M "$FOLDER") ]]; then
    echo "Mounted"
else
    echo "Not mounted"
fi

Ejemplo:

mkdir -p /tmp/foo/{a,b}
cd /tmp/foo

sudo mount -o bind a b
touch a/file
ls b/ # should show file
rm -f b/file
ls a/ # should show nothing

[[ $(findmnt -M b) ]] && echo "Mounted"
sudo umount b
[[ $(findmnt -M b) ]] || echo "Unmounted"
Jonathan H
fuente
2

Me gustan las respuestas que usan /proc/mounts, pero no me gusta hacer un simple grep. Eso puede darte falsos positivos. Lo que realmente desea saber es "si alguna de las filas tiene esta cadena exacta para el campo número 2". Entonces, haz esa pregunta. (en este caso estoy comprobando /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
Bruno Bronosky
fuente
1
¡Esto es adorable! Precisamente lo que quiere para un pequeño sistema embebido, donde no hay herramientas llamativos como mountpointo findmntexistir. Respuesta muy simple, mucha alegría, tal UNIX :)
troglobit
1

Mi solución:

is_mount() {
    path=$(readlink -f $1)
    grep -q "$path" /proc/mounts
}

Ejemplo:

is_mount /path/to/var/run/mydir/ || mount --bind /var/run/mydir/ /path/to/var/run/mydir/

Para la respuesta de Mark J. Bobak , mountpointno funciona si se monta con la bindopción en un sistema de archivos diferente.

Para la respuesta de Christopher Neylan , no es necesario redirigir la salida de grep a / dev / null, solo use grep -qen su lugar.

Lo más importante, canonicaliza la ruta usandoreadlink -f $mypath :

  • Si marca una ruta como /path/to/dir/final con barra invertida, la ruta de entrada /proc/mountso mountsalida es/path/to/dir
  • En la mayoría de las versiones de Linux, /var/run/es el enlace simbólico de /run/, por lo que si monta bind /var/run/mypathy comprueba si se montó, se mostrará como /run/mypathen /proc/mounts.
Tanky Woo
fuente
2
Creo que "grep -q" $ path "/ proc / mounts" (con espacio) es aún mejor ... De lo contrario, ¿is_mount ab devolverá verdadero si abc está montado?
alfonx
0

Otra solución limpia es así:

$ mount | grep /dev/sdb1 > /dev/null && echo mounted || echo unmounted

Por supuesto, 'echo algo' puede ser sustituido por lo que necesite hacer para cada caso.

Hudson Santos
fuente
Esto está haciendo exactamente lo mismo que la respuesta de @ ChristopherNeylan.
Jonathan H
0

Las respuestas aquí son demasiado complicadas, solo verifique si la montura existe usando:

cat /proc/mounts | tail -n 1

Esto solo genera la última carpeta montada, si desea verlos todos, simplemente elimine el comando tail.

Feria Gabriel
fuente
-4

En mi .bashrc, hice el siguiente alias:

alias disk-list="sudo fdisk -l"
Jordan Effinger
fuente
la solicitud es sobre el script y es mejor evitar sudo y el programa cuyo objetivo es "manipular la partición del disco"
bcag2