Вопрос: Каков наилучший способ проверить, установлен ли том в сценарии Bash?


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

Мне бы очень понравился метод, который я могу использовать следующим образом:

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

89
2017-08-05 20:16


Источник


Я как раз собирался написать сценарий, чтобы сделать это сам. Моя первая мысль - получить информацию из / etc / mtab. Но я еще не просмотрел мои книги bash, чтобы узнать, есть ли более прямой путь. - 3dinfluence
@ 3dinfluence - да, я знаю это давным-давно, но /etc/mtab, /proc/mounts связаны с /proc/self/mounts, (по крайней мере, на Fedora 20) - Wilf


Ответы:


Избегать использования /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.)


102
2017-08-05 20:27



Не говоря уже о том, что вызов монтирования может зависать, если точка монтирования вклинивается. - Chad Huneycutt
Хорошо для Linux, а не для freebsd или solaris. - chris
Это правда, Крис. Хотя вопрос был отмечен linux. - Dan Carley
Я думаю, что это философский вопрос - следует ли пытаться сделать вещи переносимыми, если это возможно, или мы должны просто предположить, что все текущие окна / linux в мире работают так? - chris
На самом деле, вы должны проверить на '/ mnt / foo', т.е. с пространством, или вы можете получить ложный позитив, если вы установили том с именем, например. 'fooks'. Я только что получил эту проблему с двумя точками подключения: «lmde» и «lmde-home». - marlar


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

или

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

51
2018-01-04 08:33



Только для информации: mountpoint происходит в пакете «initscripts» в Ubuntu / Debian. - blueyed
Не работал для меня - :-( - Wilf
Это призыв, на который висит мой бродяга. - dhill
Проблема с mountpoint заключается в том, что он проверяет, действительно ли монтируется точка монтирования, но не при установке устройства. Если устройство передается с -x , он указывает вам номер основного / младшего устройства, но не установлен. - vegatripy


Подобный сценарий никогда не будет переносимым. Грязный секрет в 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

Kinda сообщает вам полезную информацию.


6
2017-08-05 20:32



Вопрос отмечен linux, поэтому, возможно, он не должен быть переносимым - Rory


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

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

  если ! grep -q / backup / proc / mounts; тогда
    если ! монтирование / резервное копирование; тогда
      echo "failed"
      выход 1
    фи
  фи
  эхо «преуспело».
  # делайте что-нибудь здесь

6
2017-08-05 20:39



Активизирована как хорошая альтернатива проверки здравомыслия. - Dan Carley
Предположительно, этот метод сталкивается с теми же проблемами, что и ответ Мэтью Блоха. - mwfearnley
да, за исключением проблемы с пространством в имени файла, упомянутой в «Eliptical view» (это загоняет всю строку, а не только извлеченное поле). Проблема с подстрокой не является большой проблемой, если вы не заметите, что аргументы цитирования - это то, что вы можете сделать. например grep -q ' /backup ' /proc/mounts или mount | grep -q ' /backup ', Или перенаправлять на / dev / null, если ваш grep не поддерживает -q (который является в спецификации POSIX для grep в эти дни). - cas


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


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

  • анализ креплениеБелое пространство проблематично. Теперь это страница man:

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

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


  • grep -q а также grep -s являются лишним ненужным шагом и не поддерживаются повсюду.
  • /proc/\* не поддерживается везде.
  • mountinfo основан на / proc / ..
  • cut -f3 -d' ' помещает пробелы в именах путей

Функции:

#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

5
2018-03-15 16:42



В любом случае для Linux это лучший подход. Я видел findmnt(8) но я никогда не играл с ним. Честно говоря, если бы я обновлял некоторые из моих сценариев, которые делают этот тип вещи (или делают новые) в ящике Linux (или там, где доступна команда), это то, что я сделал бы. - Pryftan


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

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


2
2017-08-05 20:36





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

#!/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
2017-08-05 20:57



На самом деле, вероятно, нужно будет проверить статус выхода stat сначала для каждого вызова, чтобы убедиться, что файл там ... не как роман, как я думал :-( - Kyle Brandt♦