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