Перевірте, чи каталог змонтовано за допомогою bash


94

я використовую

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

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

CentOS - це операційна система.


щось на кшталт "якщо [[$ (mount -l ... | fgrep ... | wc -l)]]; тоді ..."
бобах

Подібні запитання стосуються помилок сервера , переповнення стека та обміну стеками Unix та Linux .
Саша

Відповіді:


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 | grep ...того, щоб показати вам, що прив'язка монтування все ще активна. Якщо базовий пристрій демонтується та перемонтується, прив’язка монтування фактично більше не буде підключати два файли / каталоги, хоча mountвсе ще показує, що він підключений. І якщо ви umount ...це зробите, то навіть скажуть вам, що він не встановлений, хоча mountсказав, що він був. ВЕЛИЧЕЗНИЙ недолік у файловій системі Linux.
Dev Null

@DevNull: У мене точно така проблема, яку ви описали. Будь-яке рішення цієї проблеми?
Ісаак

@Isaac, вибачте за затримку відповіді. Я спробував би використовувати readlink -f, який нічого не повертає, коли шлях / файл не існує. Якщо базового / монтування / шляху / до_файлу немає (за посиланням для читання), базове монтування порушено (перемонтувати базове монтування та прив'язку). Якщо базовий файл є і readlink -fкаже, що версії прив'язки цього файлу немає, прив'язка порушена, просто перемонтуйте прив'язку.
Dev Null

2
Якщо є виклик монтування, /mnt/md0xxxто команда буде вказувати /mnt/md0як змонтований, а те, що це не повинно бути ...
Девід Л.

179

Ви не потрудились згадати про 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'? Навіть якщо він призначений для точки монтування, якщо він насправді не має чогось змонтованого, це просто каталог.
Mark J. Bobak

2
+1, також працює на Ubuntu 10.10. Це було в Ubuntu з 8.04 .
l0b0

3
mountpoint присутній і в RHEL 6.3 (можливо, навіть у попередніх версіях)
Joril

2
mountpoint присутній і чудово працює на Debian 7 ("Wheezy") та UCS 4
Lahmizzar

7
Як зазначалося в іншому коментарі, точка монтування не працює з монтажами прив'язки. Фрагмент буде
монтовано папку

41

У керівництві 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"

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/, тому, якщо ви змонтуєте bind for /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

Безумовно, "відлуння чогось" можна замінити тим, що потрібно зробити для кожного випадку.


Це робить точно те саме, що і відповідь @ ChristopherNeylan.
Джонатан Х

0

Відповіді тут занадто складні, просто перевірте, чи існує монтування, використовуючи:

cat /proc/mounts | tail -n 1

Це виведе лише останню змонтовану папку, якщо ви хочете побачити всі з них, просто видаліть команду tail.


-4

У своєму .bashrc я зробив такий псевдонім:

alias disk-list="sudo fdisk -l"

запит стосується сценарію, і найкраще уникати sudo та програми, метою якої є "маніпулювання розділом диска"
bcag2
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.