Сообщение об ошибке не отображается, потому что этот оператор вложен в одно слишком много предложений «then». Я предлагаю упростить логику следующим образом:
is_mounted() {
mount | grep -qohw "$1
}
{
pass=
for ip in 123.456.789 223.456.789
do
if is_mounted "$ip"
then
echo -e " STACK MOUNT \e[1;33mALREADY\e[00m AVAILABLE \e[1;33mPASSED\e[00m "
pass=1
break
fi
mount -t nfs -o ro,nolock "$ip:/opt/media/" /mount/stack &>/dev/null
if is_mounted "$ip"
then
echo -e " STACK MOUNT AVAILABLE \e[1;33mPASSED\e[00m "
pass=1
break
fi
done
[ "$pass" ] || echo -e " STACK MOUNT NOT AVAILABLE \e[00;31mFAILED\e[00m"
} | tee /tmp/log
mount >>/tmp/log
В исходном коде /tmp/log
он обновляется tee -a
одновременно с тем, что он перезаписывается mount
. Это, вероятно, не будет надежным. Код выше избегает этого.
PS Как отлаживать: если код "зависает", это, вероятно, потому что mount
зависает при попытке монтирования NFS. Чтобы выяснить это наверняка, (a) добавьте некоторые диагностические echo
операторы, (b) отобразите mount
выходные данные, если таковые имеются (они были удалены в приведенном выше коде), и (c) добавьте -v
опцию, mount
чтобы сделать их подробными. Можно также удалить tee
оператор, чтобы не возникало проблем с выходной буферизацией. Таким образом, попробуйте:
is_mounted() {
mount | grep -qohw "$1
}
{
pass=
echo "Starting to loop over IP addresses"
for ip in 139.41.170.10 197.21.82.10 139.41.170.11 197.21.82.11 139.31.125.11
do
echo "Testing to see if $ip is mounted"
if is_mounted "$ip"
then
echo -e " STACK MOUNT \e[1;33mALREADY\e[00m AVAILABLE \e[1;33mPASSED\e[00m "
pass=1
break
fi
echo "Attempting to mount $ip"
mount -v -t nfs -o ro,nolock "$ip:/opt/media/" /mount/stack
echo "mount finished with exit code=$?"
if is_mounted "$ip"
then
echo -e " STACK MOUNT AVAILABLE \e[1;33mPASSED\e[00m "
pass=1
break
fi
echo "Not able to mount $ip"
done
echo "Completed loop over IP addresses with pass=$pass"
[ "$pass" ] || echo -e " STACK MOUNT NOT AVAILABLE \e[00;31mFAILED\e[00m"
}
mount >>/tmp/log
PPS Обработка неработающих хостов: при работе с монтируемыми NFS mount
команда обычно имеет очень длительный тайм-аут.на хостах (более 2 минут в моей системе). Напротив, ping
может обнаружить, если хост не работает в считанные секунды. Таким образом, чтобы избежать длительного mount
таймаута, сначала можно проверить, используется ли хост ping
. Для этого замените mount -t nfs...
строку на:
ping -c2 "$ip" >/dev/null && mount -t nfs -o ro,nolock "$ip:/opt/media/" /mount/stack &>/dev/null
Это, конечно, предполагает, что вы находитесь в сети, которая позволяет хостам отвечать на эхо-запросы.
mount
при попытке монтирования NFS. Однако, чтобы быть уверенным, пожалуйста, попробуйте новый код, который я добавил к посту. Он добавляет несколько функций отладки. Позвольте мне знать, что происходит.Это сводится к «фи» размещения. Если вы расположите свой сценарий более формально, это станет более очевидным - первый блок 'if' / 'elif' не будет завершен до третьего 'fi'. Из вашего описания требования я бы ожидал «if / elif / fi, if / elif / fi, if / else / fi».
Как отметил Слартибартфаст, может быть более читабельным / обслуживаемым, чтобы реструктурировать его в единую цепочку if / elif / elif ... / else / fi, но, как вы ее структурировали, вы можете исправить это, перемещая 'fi' после и оставляя все остальное как есть.
Текущий код с форматированием:
Как видно из рисунка, если исходное монтирование отсутствует, а первая команда монтирования завершается неудачно, то мы выходим из всего блока 'if' - невозможно выполнить ни один из последних кодов.
источник
Слишком много если
Надеюсь, это поможет.
Кроме того, для задач, которые необходимо выполнить последовательно, чтобы убедиться, что все задачи завершены успешно, вы можете попробовать объединить задачи с помощью &&. Это приведет к тому, что команды будут выполняться с остановкой последовательности, только если (и когда) произойдет сбой, и будет возвращен код завершения последнего выполнения команды:
Приведенная выше команда попытается
mount squiggle
выйти с ошибкой / ошибкой, если нет. В случае успеха он запустит команду монтирования с выводом в / tmp / log. Если эта команда не выполнена, она завершится с ошибкой. В противном случае команда grep будет запущена ....источник