sh scripting: как смонтировать удаленную файловую систему, если она не смонтирована?
В сценарии оболочки Bourne (#!/ Bin/sh) как проверить, смонтирован ли удаленный общий ресурс NFS и, если нет, смонтировать его? У меня есть ужасный набор cat, greps и ifs, использующий вывод 'mount' на данный момент, но, похоже, он не выполняет надежную работу.
9 ответов
Если возможно, настройка automount ( autofs) будет стандартным способом сделать это. Возможно, он уже находится в вашем дистрибутиве (поставляется с установкой CentOS / Redhat по умолчанию). Вот учебник.
Зачем использовать Automount?
Автомонтирование - это процесс, при котором монтирование и размонтирование определенных файловых систем выполняется демоном автоматически. Если файловая система отключена и пользователь пытается получить к ней доступ, она будет автоматически (повторно) подключена. Это особенно полезно в больших сетевых средах и для перекрестного монтирования файловых систем между несколькими компьютерами (особенно теми, которые не всегда подключены к сети).
Можете ли вы grep /etc/mtab
для устройства? grep -c '/mnt/foo' /etc/mtab
если grep выдает "1", то /mnt/foo монтируется.
Использование mountpoint
,
mountpoint -q /path/to/nfs/share || mount -t nfs server:/nfs/share /path/to/nfs/share
(Я не знаю, насколько широко или портативно mountpoint
является; это предоставляется пакетом initscripts на моем сервере Debian.)
В солярисе
Если вы проверили, что в системе, где запущен скрипт, смонтирована удаленная файловая система, тогда
ISMOUNTED=`/usr/sbin/mount | grep "^/path/to/mount "`
if [ "$ISMOUNTED" = "" ]
then
mountcommand*
fi
*mountcommand может быть / 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
#!/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
Несколько предложений:
Если в вашем дистрибутиве есть RC-скрипт для обработки монтирования NFS, его целесообразно использовать или проверить его состояние. Вы можете столкнуться с неприятностями, если неправильно предположите, что такие услуги, как
portmap
а такжеstatd
уже начались.Часто это более надежно в использовании
/proc/mounts
в пользу выхода изmount
или, возможно, устаревшее содержание/etc/mtab
,использование
grep -qs
и проверьте код возврата, чтобы определить, присутствует ли монтирование или нет.Предполагая, что все монтирования NFS перечислены в
/etc/fstab
должны быть установлены, тогда вы можете установить их универсально сmount -a -t nfs,nfs4
, Все, что уже установлено, будет игнорироваться.