it-swarm-ru.tech

Как лучше всего проверить, смонтирован ли том в скрипте Bash?

Как лучше всего проверить, смонтирован ли том в скрипте Bash?

Что мне действительно нравится, так это метод, который я могу использовать так:

if <something is mounted at /mnt/foo> 
then
   <Do some stuff>
else
   <Do some different stuff>
fi
109
Mark Biek

Избегать использования /etc/mtab потому что это может быть противоречивым.

Избегайте трубопровода mount, потому что это не должно быть таким сложным.

Просто:

if grep -qs '/mnt/foo ' /proc/mounts; then
    echo "It's mounted."
else
    echo "It's not mounted."
fi

(Пробел после /mnt/foo, чтобы избежать совпадения, например /mnt/foo-bar.)

122
Dan Carley
if mountpoint -q /mnt/foo 
then
   echo "mounted"
else
   echo "not mounted"
fi

или

mountpoint -q /mnt/foo && echo "mounted" || echo "not mounted"
61
Zaptac

findmnt -rno SOURCE,TARGET "$1" избегает всех проблем в других ответах. Это чисто делает работу с одной командой.


Другие подходы имеют эти недостатки:

  • grep -q а также grep -s - это лишний ненужный шаг, который не поддерживается везде.
  • /proc/\* не поддерживается везде.
  • mountinfo основан на/proc/..
  • cut -f3 -d' ' портит пробелы в именах путей
  • Парсинг mount пустое пространство проблематично. Это страница руководства теперь говорит:

.. Режим листинга поддерживается только для обратной совместимости.

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


функции Bash:

#These functions return exit codes: 0 = found, 1 = not found

isMounted    () { findmnt -rno SOURCE,TARGET "$1" >/dev/null;} #path or device
isDevMounted () { findmnt -rno SOURCE        "$1" >/dev/null;} #device only
isPathMounted() { findmnt -rno        TARGET "$1" >/dev/null;} #path   only

#where: -r = --raw, -n = --noheadings, -o = --output

Примеры использования:

if isPathMounted "/mnt/foo bar";      #Spaces in path names are ok.
   then echo "path is mounted"
   else echo "path is not mounted"
fi

if isDevMounted "/dev/sdb4"; 
   then echo "device is mounted"
   else echo "device is not mounted"
fi

#Universal:
if isMounted "/mnt/foo bar"; 
   then echo "device is mounted"
   else echo "device is not mounted"
fi

if isMounted "/dev/sdb4";
   then echo "device is mounted"
   else echo "device is not mounted"
fi
21
Elliptical view

Такой сценарий никогда не будет переносимым. Грязный секрет в Unix заключается в том, что только ядро ​​знает, где находятся файловые системы, и, за исключением таких вещей, как/proc (не переносимый), он никогда не даст вам прямого ответа.

Обычно я использую df, чтобы узнать, что такое точка монтирования подкаталога и в какой файловой системе он находится.

Например (требуется posix Shell, такой как ash/AT & T ksh/bash/etc)

case $(df  $mount)
in
  $(df  /)) echo $mount is not mounted ;;
  *) echo $mount has a non-root filesystem mounted on it ;;
esac

Кинда рассказывает вам полезную информацию.

7
chris

следующее - то, что я использую в одном из моих заданий cron резервного копирования rsync. он проверяет, смонтирован ли/backup, и пытается смонтировать его, если это не так (может произойти сбой, потому что диск находится в отсеке горячей замены и может даже не присутствовать в системе)

ПРИМЕЧАНИЕ: следующее работает только на linux, потому что это greps/proc/mounts - более переносимая версия запускает 'mount | grep/backup ', как в ответе Мэтью ..

  если ! grep -q/backup/proc/mounts; тогда 
 если! монтирование/резервное копирование; затем 
 эхо "не удалось" 
 выход 1 
 fi 
 fi 
 эхо "успешно". 
 # делать вещи здесь 
6
cas

Поскольку для монтирования вам все равно нужен каталог, который монтируется, моя стратегия всегда заключалась в том, чтобы создать поддельный файл со странным именем, которое никогда не будет использоваться, и просто проверить его существование. Если файл был там, то на этом месте ничего не было смонтировано ...

Я не думаю, что это работает для монтажа сетевых дисков или подобных вещей. Я использовал его для флешек.

2
Brian Postow

Как насчет сравнения номеров устройств? Я просто пытался придумать самый эзотерический путь ..

#!/bin/bash
if [[ $(stat -c "%d" /mnt) -ne $(stat -c "%d" /mnt/foo) ]]; then
    echo "Somethin mounted there I reckon"
fi

В моей логике есть недостаток ...

Как функция:

#!/usr/bin/bash
function somethingMounted {
        mountpoint="$1"
        if ! device1=$(stat -c "%d" $mountpoint); then
                echo "Error on stat of mount point, maybe file doesn't exist?" 1>&2
                return 1
        fi
        if ! device2=$(stat -c "%d" $mountpoint/..); then
                echo "Error on stat one level up from mount point, maybe file doesn't exist?" 1>&2
                return 1
        fi

        if [[ $device1 -ne $device2 ]]; then
                #echo "Somethin mounted there I reckon"
                return 0
        else
                #echo "Nothin mounted it seems"
                return 1
        fi
}

if somethingMounted /tmp; then
        echo "Yup"
fi

Эхо-сообщения об ошибках, вероятно, являются избыточными, потому что stat будет отображать и ошибку.

2
Kyle Brandt

Извините, что поднял это, но я думаю, что это довольно полезно:

if awk '{print $2}' /proc/mounts | grep -qs "^/backup$"; then
    echo "It's mounted."
else
    echo "It's not mounted."
fi

Это получает 2-й столбец/proc/mounts (2-й столбец = точки монтирования).

Затем он получает вывод. Обратите внимание на ^ и $, это предотвращает совпадение/backup/mnt/backup или/backup-old и т.д.

1
David

Ни один из них не удовлетворяет случаю использования, где данный каталог является подкаталогом в другой точке монтирования. Например, у вас может быть/вещь, которая является монтированием NFS к хосту:/real_thing. Использование grep для этой цели в/proc/mounts/etc/mtab или 'mount' не будет работать, потому что вы будете искать точку монтирования, которая не существует. Например,/thing/thingy не является точкой монтирования, но/thing монтируется на хосте:/real_thing. Лучший ответ, за который проголосовали здесь, на самом деле НЕ "лучший способ определить, смонтирован ли каталог/volumne". Я бы проголосовал за использование "df -P" (режим стандартов -P POSIX) в качестве более чистой стратегии:

dev=`df -P /thing/thingy | awk 'BEGIN {e=1} $NF ~ /^\/.+/ { e=0 ; print $1 ; exit } END { exit e }'` && {
    echo "Mounted via: $dev"
} || {
    echo "Not mounted"
}

Результат выполнения этого будет:

Mounted via: Host:/real_thing

Если вы хотите знать, какова реальная точка монтирования, не проблема:

mp=`df -P /thing/thingy | awk 'BEGIN {e=1} $NF ~ /^\/.+/ { e=0 ; print $NF ; exit } END { exit e }'` && {
    echo "Mounted on: $mp"
} || {
    echo "Not mounted"
}

Результатом этой команды будет:

Mounted on: /thing

Все это очень полезно, если вы пытаетесь создать какой-либо chroot, который отражает точки монтирования вне chroot, внутри chroot, через какой-либо произвольный каталог или список файлов.

1
Craig

Зависит от того, что вы знаете о том, что вы проверяете.

В конкретном случае, который я недавно исследовал, когда меня интересовало, был ли установлен конкретный флеш-накопитель, что проще всего проверить на наличие/dev/disc/by-label /. Если устройство подключено, сценарии udev удостоверяются, что ссылка существует (и что она удаляется при отключении устройства).

(Это не очень переносимый ответ; он работает во многих современных дистрибутивах Linux, однако, вопрос был помечен для Linux, и это совершенно иной подход, чем все упомянутые, поэтому он расширяет возможности.)

0
David Dyer-Bennet

Мне нравятся ответы, которые используют /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
0
Bruno Bronosky

Хотя это вопрос Linux, почему бы не сделать его переносимым, когда это легко сделать?

Страница руководства grep гласит:

Скрипты Portable Shell должны избегать как -q, так и -s и перенаправлять стандартный вывод и вывод ошибок на /dev/null вместо.

Поэтому я предлагаю следующее решение:

if grep /mnt/foo /proc/mounts > /dev/null 2>&1; then
        echo "Mounted"
else
        echo "NOT mounted"
fi
0
fex

grep/etc/mtab для вашей точки монтирования может быть?

0
Ophidian

Должно ли это быть более сложным, чем это?

mount \
    | cut -f 3 -d ' ' \
    | grep -q /mnt/foo \
  && echo "mounted" || echo "not mounted"
0
Matthew Bloch

Эта?:

volume="/media/storage"
if mount|grep $volume; then
echo "mounted"
else
echo "not mounted"
if

От: форум Ubunt

0
RateControl

Создайте файл под точкой монтирования, например check_mount а затем просто проверить, существует ли он?

if [[ -f /something/check_mount ]]; then
   echo "Mounted
   RC=$?
else
   Echo "Not mounted"
   RC=0
fi
exit $RC
0
Wiljami