Як перевірити, чи встановлена ​​файлова система зі скриптом


19

Я новачок в сценарії ... Я можу робити дуже основні речі, але зараз мені потрібна рука.

У мене локальна файлова система, яка змонтується лише тоді, коли мені потрібно зробити резервну копію.

Я починаю з цього.

#!/bin/bash
export MOUNT=/myfilesystem

if grep -qs $MOUNT /proc/mounts; then
  echo "It's mounted."
else
  echo "It's not mounted."; then
  mount $MOUNT;
fi

Як я вже говорив, я дуже базовий в сценаріях. Я чув, що ви можете перевірити стан mountкоманди, переглянувши коди повернення.

RETURN CODES
       mount has the following return codes (the bits can be ORed):
       0      success
       1      incorrect invocation or permissions
       2      system error (out of memory, cannot fork, no more loop devices)
       4      internal mount bug
       8      user interrupt
       16     problems writing or locking /etc/mtab
       32     mount failure
       64     some mount succeeded

Я не знаю, як це перевірити. Будь-які вказівки?


2
У ; thenвашому сценарії смішно звисає .
Мат

чому ми експортуємо ваунт MOUNT, а також видаляємо ";"
Майк Q

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

Відповіді:


19

mountСпеціальний параметр оболонки ви можете перевірити код статусу та найбільш добре написаних виконуваних файлів ?.

Від man bash:

? Expands to the exit status of the most recently executed foreground pipeline.

Після запуску mountкоманди негайно виконання echo $?буде надрукувати код стану з попередньої команди.

# mount /dev/dvd1 /mnt
  mount: no medium found on /dev/sr0
# echo $?
  32

Не всі виконувані файли мають чітко визначені коди статусу. Як мінімум, він повинен вийти з кодом успіху (0) або відмови (1), але це не завжди так.

Щоб розширити (і виправити) ваш приклад сценарію, я додав вкладену ifконструкцію для наочності. Це не єдиний спосіб перевірити код статусу та виконати дію, але його найпростіше читати під час навчання.

#!/bin/bash
mount="/myfilesystem"

if grep -qs "$mount" /proc/mounts; then
  echo "It's mounted."
else
  echo "It's not mounted."
  mount "$mount"
  if [ $? -eq 0 ]; then
   echo "Mount success!"
  else
   echo "Something went wrong with the mount..."
  fi
fi

Для отримання додаткової інформації про "Вихід та статус виходу" ви можете ознайомитись з Додатковою інструкцією по Bash-скриптуванню .


1
Експортувати не потрібно $MOUNT. Цей скрипт також порушиться, якщо файлова система має будь-який символ, який зазнав би розщеплення слів (пробіли тощо). Ви завжди повинні цитувати свої розширення.
Кріс Даун

@ChrisDown Ви маєте рацію. Я видалив лише очевидне звисання "; тоді". Надалі сміливо редагуйте мою відповідь, щоб зробити її правильнішою.
Джордж М

Е ... це все одно зламається. Ви досі не цитували розширення. За вашою порадою, я зараз це зроблю.
Кріс Даун

Я також не рекомендую посилатися на сумнозвісний посібник з сценаріїв Bash, він повний помилок і навчить людей писати помилки, а не сценарії. BashGuide - набагато краща альтернатива.
Кріс Даун

2
@ChrisDown "Розділення слів з'їсть ваших дітей, якщо ви не цитуєте речі належним чином". Слова, якими потрібно жити.
Джордж М

36

Багато дистрибутивів Linux мають mountpointкоманду. Він може явно використовуватись для перевірки того, чи є каталог монтажною точкою. Просто так:

#!/bin/bash    
if mountpoint -q "$1"; then
    echo "$1 is a mountpoint"
else
    echo "$1 is not a mountpoint"
fi

1
Цей підхід не вдасться, якщо ви спробуєте перевірити enfs, оскільки ви натрапите на помилку, у якій відмовлено у дозволі, коли буде запущений користувачем, який не має root.
Denys S.

Моє рішення працює з encfs.
Теодор Р. Сміт

3

Ще один спосіб:

if findmnt ${mount_point}) >/dev/null 2>&1 ; then
  #Do something for positive result (exit 0)
else
  #Do something for negative result (exit 1)
fi

Привіт @sungtm; виявляється, що ви ввійшли через новий окремий обліковий запис. Оскільки ваш обліковий запис "Sun" не має великої активності, я пропоную вам продовжувати використовувати новий обліковий запис "sungtm" , оскільки це простіше. Якщо ви хочете об'єднати облікові записи, повідомте мене, позначивши цей коментар, і ми зв’яжемось із командою Stack Exchange. Дякую!
Джефф Шаллер

Зверніть увагу, що для encfs, findmntвін повинен постачатися з параметром --source encfs, інакше він завжди вважатиме каталог встановленим, оскільки він повертається до батьківського монтажу.
Burkart

2

Найпростіший спосіб, який не потребує кореня, це:

if $(df | grep -q /mnt/ramdisk); then

fi

або побачити, чи він не встановлений:

if ! $(df | grep -q /mnt/ramdisk); then

fi

mountкоманда не потребує в кореневої доступ, dfорієнтований на дисковий простір не на точки монтування ...
Філіп Gachoud

1

Короткі заяви

Перевірте, чи встановлено :

mount|grep -q "/mnt/data" && echo "/mnt/data is mounted; I can follow my job!"

Перевірте, чи не встановлено :

mount|grep -q "/mnt/data" || echo "/mnt/data is not mounted I could probably mount it!"

0

Я спробував із сценарієм нижче

#!/bin/bash
echo "enter the file system to check whether its mounted or not"
read p
echo $p
for i in `cat /proc/mounts`
do
if [[ $p =~ $i ]]
then
echo "$p is mounted"
else
echo "$p is not mounted"
fi
done

Єдине введення, яке потрібно вказати - це ім'я файлової системи

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