linux - script - Compruebe si el directorio se montó con bash
scripts bash ejemplos (6)
estoy usando
mount -o bind /some/directory/here /foo/bar
Quiero verificar /foo/bar
aunque con un script bash, y ver si ha sido montado? De lo contrario, llame al comando de montaje anterior, o haga otra cosa. ¿Cómo puedo hacer esto?
CentOS es el sistema operativo.
Ejecutar el comando mount
sin argumentos le dirá los montajes actuales. Desde un script de shell, puede verificar el punto de montaje con grep
y un enunciado if:
if mount | grep /mnt/md0 > /dev/null; then
echo "yay"
else
echo "nay"
fi
En mi ejemplo, la instrucción if está verificando el código de salida de grep
, que indica si hubo una coincidencia. Como no quiero que la salida se muestre cuando hay una coincidencia, la redirijo a /dev/null
.
El manual de mountpoint
dice:
comprueba si el directorio o archivo dado se menciona en el archivo / proc / self / mountinfo.
El manual de mount
dice 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 para usar es findmnt
, que es en sí mismo parte del paquete util-linux
y, según el manual:
es capaz de buscar en / etc / fstab, / etc / mtab o / proc / self / mountinfo
Por lo tanto, en realidad busca más cosas que el punto de mountpoint
. También proporciona la opción conveniente:
-M, --mountpoint path
Defina explícitamente el archivo o directorio de punto de montaje. Ver 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"
En mi .bashrc, hice el siguiente alias:
alias disk-list="sudo fdisk -l"
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 , el punto de mountpoint
no funciona si se monta con la opción de bind
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 -q
lugar.
Lo más importante es canonicalizar la ruta usando readlink -f $mypath
:
- Si comprueba la ruta como
/path/to/dir/
final con barra diagonal inversa, la ruta en/proc/mounts
omount
salida 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 para/var/run/mypath
y comprueba si se montó, se mostrará como/run/mypath
en/proc/mounts
.
No se molestó en mencionar un O / S.
Ubuntu Linux 11.10 (y probablemente los sabores más actualizados de Linux) tienen el comando mountpoint
.
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 tu caso, deberías poder usar la opción -q
, como esta:
mountpoint -q /foo/bar || mount -o bind /some/directory/here /foo/bar
Espero que ayude.
Otra solución limpia es así:
$ mount | grep /dev/sdb1 > /dev/null && echo mounted || echo unmounted
Por supuesto, ''echo something'' se puede sustituir por lo que sea necesario para cada caso.