2013-07-12 6 views
7

Как правило, на NFS Client, как определить Установленная точка больше не доступна или DEAD с сервера, используя сценарий Bash Shell?Linux Shell Script: Как определить точку монтирования NFS (или сервера)?

Обычно я делаю:

if ls '/var/data' 2>&1 | grep 'Stale file handle'; 
then 
    echo "failing"; 
else 
    echo "ok"; 
fi 

Но проблема в том, когда особенно сервер NFS полностью мертв или остановлен, даже, ls команду, в этот каталог, на стороне клиента будет повешен или умер. Значит, сценарий выше не более полезен.

Есть ли способ обнаружить это снова, пожалуйста?

ответ

10

"стат" команда несколько чище способ:

statresult=`stat /my/mountpoint 2>&1 | grep -i "stale"` 
if [ "${statresult}" != "" ]; then 
    #result not empty: mountpoint is stale; remove it 
    umount -f /my/mountpoint 
fi 

Кроме того, вы можете использовать rpcinfo для обнаружения, доступен ли доля удаленного NFS:

rpcinfo -t remote.system.net nfs > /dev/null 2>&1 
if [ $? -eq 0 ]; then 
    echo Remote NFS share available. 
fi 

Добавлено 2013-07-15T14 : 31: 18-05: 00:

Я изучил это дальше, так как я также работаю над скриптом, который должен распознавать устаревшие точки монтирования. Вдохновленный one of the replies к «Есть хороший способ обнаружить затхлый NFS монтировать», я думаю, что следующий может быть наиболее надежным способом проверить черствости определенной точки монтирования в Баш:

read -t1 < <(stat -t "/my/mountpoint") 
if [ $? -eq 1 ]; then 
    echo NFS mount stale. Removing... 
    umount -f -l /my/mountpoint 
fi 

«читать -t1 «Конструкция надежно разгоняет подоболочку, если команда stat зависает по какой-то причине.

Добавлено 2013-07-17T12: 03: 23-05: 00:

Хотя read -t1 < <(stat -t "/my/mountpoint") работы, не кажется, что должен быть способ, чтобы отключить его выход ошибки при точка_монтирования несвежий. Добавление > /dev/null 2>&1 либо внутри подоболочки, либо в конце командной строки разбивает его. Используя простой тест: if [ -d /path/to/mountpoint ] ; then ... fi также работает и может быть предпочтительнее в сценариях. После долгих испытаний это то, что я использовал.

Добавлено 2013-07-19T13: 51: 27-05: 00:

В ответ на мой вопрос «How can I use read timeouts with stat?» при условии, дополнительные детали о приглушения выход стат (или rpcinfo), когда цель не доступен и команда зависает в течение нескольких минут, прежде чем она отключится сама по себе. В то время как [ -d /some/mountpoint ] может использоваться для обнаружения устаревшей точки монтирования, альтернативы для rpcinfo нет, поэтому использование перенаправления read -t1 является наилучшим вариантом. Выход из подоболочки можно отключить с помощью 2> & -. Вот пример из CodeMonkey's response:

mountpoint="/my/mountpoint" 
read -t1 < <(stat -t "$mountpoint" 2>&-) 
if [[ -n "$REPLY" ]]; then 
    echo "NFS mount stale. Removing..." 
    umount -f -l "$mountpoint" 
fi 

Возможно, теперь этот вопрос полностью ответил :).

+0

Я использовал устаревшее обнаружение точки монтирования NFS в моем скрипте ** nfs_automount **, [теперь доступно на GitHub] (https://github.com/vwal/nfs_automount). – Ville

+3

Хороший ответ. Я видел 'read -t1 <<(stat -t" $ MOUNT_DIR "2> & -)' предоставление возвращаемого значения '142'. Итак, сделаем '[! $? -eq 0] ', поскольку тест, вероятно, лучше. – psiphi75

+3

Еще один момент: 'read -t1 <<(stat -t" $ mountpoint "2> & -)' оставит дескриптор открытого файла (или аналогичный) прикрепленной папке. Следовательно, параметр mount не будет работать, если вы не используете флаг '-l'. Вместо этого вы можете использовать 'timeout 1 stat -t '$ mountpoint">/dev/null'. Это убьет эту команду 'stat' и, следовательно, убьет ее дескриптор открытого файла. – psiphi75

1

Окончательные ответы, полученные Ville и CodeMonkey, почти правильны. Я не уверен, как никто этого не заметил, но строка $ REPLY с контентом имеет успех, а не сбой. Таким образом, строка пустая $ REPLY означает, что mount устарел.Таким образом, условно следует использовать -z, не -n:

mountpoint="/my/mountpoint" 
read -t1 < <(stat -t "$mountpoint" 2>&-) 
if [ -z "$REPLY" ] ; then 
    echo "NFS mount stale. Removing..." 
    umount -f -l "$mountpoint" 
fi 

я это несколько раз с действительной и недействительной точкой монтирования побежал, и он работает. Проверка -n дала мне обратные результаты, повторяя, что гора была устаревшей, когда она была абсолютно достоверной.

Кроме того, двойная скобка не требуется для простой проверки строки.