Назад | Перейти на главную страницу

sh scripting: как смонтировать удаленную файловую систему, если она не смонтирована?

Как в сценарии оболочки bourne (#! / Bin / sh) проверить, смонтирован ли удаленный общий ресурс NFS, а если нет, смонтировать его? У меня есть уродливый набор cat, greps и ifs, использующий вывод 'mount' в данный момент, но, похоже, он не выполняет надежную работу.

Если возможно, стандартным способом сделать это будет установка automount (autofs). Возможно, он уже находится в вашем дистрибутиве (поставляется с установленной по умолчанию CentOS / Redhat). Вот учебник.

Зачем использовать Automount?

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

Использовать mountpoint.

mountpoint -q /path/to/nfs/share || mount -t nfs server:/nfs/share /path/to/nfs/share

(Я не знаю, насколько распространены или переносимы mountpoint является; он предоставляется пакетом initscripts на моем сервере Debian.)

Можете ли вы grep /etc/mtab для устройства? grep -c '/mnt/foo' /etc/mtab если grep выводит '1', то монтируется / mnt / foo.

В солярисе

Если вы проверяете, что в системе, в которой запущен скрипт, смонтирована удаленная файловая система, тогда

ISMOUNTED=`/usr/sbin/mount | grep "^/path/to/mount "`
if [ "$ISMOUNTED" = "" ]
then
    mountcommand*
fi

* команда mount может быть / usr / sbin / mount / path / to / mount, если есть соответствующая запись в / etc / vfstab или / usr / sbin / mount remotehost: / remote / path / path / to / mount

Возможно, вы сможете что-то сделать с помощью stat. Поле «устройство» будет отличаться в разных файловых системах. Итак, если вы хотите узнать, /mnt/foo установлен, вы бы сравнили вывод stat -c%d /mnt/ к stat -c%d /mnt/foo/. Если устройство другое, то там что-то монтируется.

if [ `stat -c%d /mnt/` -eq `stat -c%d /mnt/foo/` ]; then
    mount /mnt/foo
fi

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

Если вы хотите сделать это более разумно, вы можете посмотреть, как это сделать в Perl, Python или C, где вы можете использовать библиотечные функции, чтобы общаться с portmapper для получения информации о смонтированных файловых системах в виде структуры данных. Затем вы можете разумно выполнять задачи, чтобы изменить текущее состояние на желаемое.

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

$ cd /net/remoteshare
$ df -l .
df: no file systems processed
$ echo $?
1

Несколько предложений:

  • Если в вашем дистрибутиве есть сценарий RC для обработки монтирования NFS, было бы разумно использовать или проверить его статус. Вы можете столкнуться с проблемами, если ошибочно предположите, что такие службы, как portmap и statd уже запущены.

  • Часто более надежно использовать /proc/mounts в пользу выхода из mount или возможно устаревшее содержание /etc/mtab.

  • Использовать grep -qs и проверьте код возврата, чтобы определить, присутствует ли монтировка.

  • Предполагая, что все монтирования NFS, перечисленные в /etc/fstab должен быть смонтированными, вы можете установить их универсально с помощью mount -a -t nfs,nfs4. Все, что уже смонтировано, будет проигнорировано.

#!/bin/bash
mountpoint='your mountpoint'
mobileno=""
smsurl=""
mntcmd='/bin/mount -a'
mntchkcmd='/bin/mount'   
###Check mount point available or not IF not alert to service own
${mntchkcmd} | /bin/grep ${mountpoint} > /dev/null 2>&1
if [ $? != 0 ]
        then
    ${mntcmd}
    sleep 5
    ${mntchkcmd} | /bin/grep ${mountpoint} > /dev/null 2>&1
    if [ $? != 0 ]
        then
        echo "issue with mount point"
        exit
    fi
fi
###If mount point is available then check it for utilisation.
warn=90
critical=95
disksize=$(/bin/df -k ${mountpoint} | /bin/grep ${mountpoint} | /bin/awk -F% '{print $1}' | /bin/awk '{print $4}')
if [ ${disksize} -gt ${warn} ]
    then
        echo 'warn'
    elif [ ${disksize} -gt ${critical} ] 
    then
        echo 'critical' 
fi