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