Как проверить, смонтирована ли файловая система с помощью скрипта

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

Я не знаю, как это проверить. Любое руководство?

maniat1k
источник
2
В ; thenвашем сценарии смешно болтается .
Мат
почему мы экспортируем переменную MOUNT, а также удаляем символ ";"
Майк Q
Подобные вопросы касаются неисправностей сервера , переполнения стека и Unix & Linux Stack Exchange .
саша

Ответы:

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

Для получения дополнительной информации о «Exit и Exit Status», вы можете обратиться к Расширенному Руководству по Bash-Scripting .

Джордж М
источник
1
Там нет необходимости экспортировать $MOUNT. Этот скрипт также сломается, если в файловой системе есть какой-либо символ, который подвергнется разделению слов (пробелы и т. Д.). Вы всегда должны цитировать свои расширения.
Крис Даун
@ChrisDown Ты прав. Я только удалил очевидное висячее «тогда». В будущем не стесняйтесь редактировать мой ответ, чтобы сделать его более правильным.
Джордж М
Э-э ... это все еще сломается. Вы еще не цитировали расширения. По твоему совету я сделаю это сейчас.
Крис Даун
Я также не рекомендовал бы ссылаться на печально известное «Расширенное» руководство по написанию сценариев Bash, оно полно ошибок и научит людей писать ошибки, а не сценарии. BashGuide - намного лучшая альтернатива.
Крис Даун
2
@ChrisDown "Разделение слов съест твоих детей, если ты не процитируешь вещи должным образом." Слова чтобы жить.
Джордж М
35

Многие дистрибутивы Linux имеют mountpointкоманду. Он может явно использоваться для проверки, является ли каталог точкой монтирования. Просто как это:

#!/bin/bash    
if mountpoint -q "$1"; then
    echo "$1 is a mountpoint"
else
    echo "$1 is not a mountpoint"
fi
grosshat
источник
1
Этот подход потерпит неудачу, если вы попытаетесь проверить encfs, так как вы столкнетесь с ошибкой отказа в доступе при запуске пользователем без полномочий root.
Денис С.
Мое решение работает с 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

Самый простой способ, который не требует root:

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

Единственное, что вам нужно указать - это имя файловой системы.

Правин Кумар Б.С.
источник