Сообщение об ошибке не отображается, потому что этот оператор вложен в одно слишком много предложений «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
Это, конечно, предполагает, что вы находитесь в сети, которая позволяет хостам отвечать на эхо-запросы.