Проверьте, установлен ли каталог с bash

Я использую

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

Я хочу проверить /foo/bar, хотя с bash script, и посмотреть, смонтирован ли он? Если нет, то вызовите приведенную выше команду mount, иначе сделайте что-нибудь еще. Как я могу это сделать?

CentOS - это операционная система.

Ответ 1

Запуск команды mount без аргументов покажет вам текущие настройки. Из оболочки script вы можете проверить точку монтирования с помощью grep и if-statement:

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

В моем примере оператор if проверяет код выхода grep, который указывает, было ли совпадение. Поскольку я не хочу, чтобы вывод отображался, когда есть совпадение, я перенаправляю его на /dev/null.

Ответ 2

Вы не потрудились упомянуть O/S.

Ubuntu Linux 11.10 (и, возможно, самые современные варианты Linux) имеют команду mountpoint.

Вот пример на одном из моих серверов:

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

Собственно, в вашем случае вы можете использовать параметр -q, например:

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

Надеюсь, что это поможет.

Ответ 3

Еще одно чистое решение:

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

Конечно, "echo something" может быть заменено тем, что вам нужно делать для каждого случая.

Ответ 4

В руководстве mountpoint указано, что оно:

проверяет, указан ли данный каталог или файл в файле /proc/self/mountinfo.

В руководстве mount говорится, что:

Режим листинга поддерживается только для обратной совместимости. Для более надежный и настраиваемый выход использует findmnt (8), особенно в вашем скрипты.

Итак, правильная команда для использования - findmnt, которая сама является частью util-linux пакет и, согласно руководству:

способен искать в /etc/fstab,/etc/mtab или/proc/self/mountinfo

Поэтому он ищет больше вещей, чем mountpoint. Он также предоставляет удобный вариант:

-M, - путь точки монтирования

Явным образом определите файл или каталог точки монтирования. См. Также --target.

В заключение, чтобы проверить, установлен ли каталог с помощью bash, вы можете использовать:

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

Пример:

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"

Ответ 5

Мое решение:

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

Пример:

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

Для Ответ Марка Дж. Бобака, mountpoint не работает, если mount с параметром bind в разных файловых системах.

Для Кристофер Нейлан ответ, не нужно перенаправлять вывод grep на /dev/null, вместо этого используйте grep -q.

Самое главное, канонизировать путь, используя readlink -f $mypath:

  • Если вы проверите путь, например /path/to/dir/, завершите обратную косую черту, путь в /proc/mounts или mount будет /path/to/dir
  • В большинстве релизов Linux /var/run/ является символической ссылкой /run/, поэтому, если вы монтируете bind для /var/run/mypath и проверяете, смонтирован ли он, он будет отображаться как /run/mypath в /proc/mounts.

Ответ 6

В моем .bashrc я сделал следующий псевдоним:

alias disk-list="sudo fdisk -l"