Как в сценарии оболочки 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