Проверьте, смонтирован ли каталог с помощью bash

95

Я использую

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

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

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

Джастин
источник
что-то вроде "if [[$ (mount -l ... | fgrep ... | wc -l)]]; then ..."
bobah
Подобные вопросы находятся на сервере Fault , переполнение стека и Unix и Linux Stack бирже .
Саша

Ответы:

69

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

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

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

Кристофер Нейлан
источник
4
Вам не нужно проверять, возвращает ли он строку. grepвозвращает ненулевой статус выхода, если совпадений нет. Нет необходимости ни в тесте, ни в подоболочке, созданной $ (). if command | grep -q 'stuff'; then ...
jordanm
32
Это не работает с mount bind и поэтому не должно приниматься в качестве ответа. Этот ответ должен быть отклонен. Вы не можете рассчитывать на mount | grep ...то, что покажете вам, что ваша привязка монтирования все еще активна. Если базовое устройство размонтировано и перемонтировано, привязка монтирования больше не будет соединять два файла / каталога, хотя по- mountпрежнему показывает, что они подключены. И если вы это сделаете, umount ...он даже скажет вам, что он не установлен, хотя mountсказал, что был. ОГРОМНЫЙ недостаток файловой системы Linux.
Dev Null,
@DevNull: У меня именно та проблема, которую вы описали. Любое решение этой проблемы?
Исаак
@Isaac, извините за задержку с ответом. Я бы попробовал использовать readlink -f, который ничего не возвращает, если путь / файл не существует. Если базового / mount / path / to_file нет (на ссылку для чтения), базовое монтирование сломано (перемонтируйте базовое монтирование и привязку). Если базовый файл присутствует и readlink -fсообщает, что версия привязки этого файла отсутствует, привязка нарушена, просто перемонтируйте привязку.
Dev Null
2
Если есть монтировка, /mnt/md0xxxтак называемая, команда будет указывать /mnt/md0как смонтированную, в то время как то, что она не обязательно должна быть ...
Дэвид Л.
181

Вы не удосужились упомянуть 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

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

Марк Дж. Бобак
источник
7
У вас действительно что-то смонтировано в то время, когда вы запускали команду 'mountpoint'? Даже если он задуман как точка монтирования, если на самом деле что-то не смонтировано, это просто каталог.
Марк Дж. Бобак,
2
+1, работает и на Ubuntu 10.10. Он находится в Ubuntu с 8.04 .
l0b0
3
точка монтирования присутствует и в RHEL 6.3 (возможно, даже в более ранних версиях)
Joril
2
mountpoint присутствует и отлично работает на Debian 7 ("Wheezy") и UCS 4
Lahmizzar
7
Как упоминалось в другом комментарии, точка монтирования не работает с монтированием привязки. Фрагмент будет монтировать
каталог
42

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

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

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

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

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

может искать в / etc / fstab, / etc / mtab или / proc / self / mountinfo

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

-M, --mountpoint путь

Явно определите файл или каталог точки монтирования. См. Также --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"
Джонатан Х
источник
2

Мне нравятся используемые ответы /proc/mounts, но я не люблю простой grep. Это может дать вам ложные срабатывания. Что вы действительно хотите знать, так это «есть ли в какой-либо из строк именно эту строку для поля номер 2». Итак, задайте этот вопрос. (в данном случае проверяю /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
Бруно Броноски
источник
1
Это прекрасно! Именно то, что вам нужно для небольшой встраиваемой системы, где нет таких ярких инструментов, как mountpointили findmntнет. Очень простой ответ, много радости, такой UNIX :)
троглобит
1

Мое решение:

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не работает , если установить с bindопцией в другой файловой системе.

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

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

  • Если вы отметите путь, такой как /path/to/dir/конец, с обратной косой чертой, путь в /proc/mountsили mountвыходе будет/path/to/dir
  • В большинстве выпусков Linux /var/run/это символическая ссылка /run/, поэтому, если вы смонтируете привязку /var/run/mypathи проверите, смонтирована ли она, она будет отображаться как /run/mypathв /proc/mounts.
Танки Ву
источник
2
Я думаю, что "grep -q" $ path "/ proc / mounts" (с пробелом) еще лучше ... В противном случае is_mount ab вернет true, если abc смонтирован ?!
alfonx
0

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

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

Конечно, «echo something» можно заменить на все, что вам нужно сделать для каждого случая.

Хадсон Сантос
источник
Это делает то же самое, что и ответ @ChristopherNeylan.
Jonathan H
0

Ответы здесь слишком сложны, просто проверьте, существует ли монтирование, используя:

cat /proc/mounts | tail -n 1

Это выводит только последнюю смонтированную папку, если вы хотите увидеть их все, просто удалите команду tail.

Габриэль Фэйр
источник
-4

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

alias disk-list="sudo fdisk -l"
Джордан Эффингер
источник
запрос касается сценария, и лучше избегать использования sudo и программы, целью которой является «управление разделом диска»
bcag2