A mensagem de falha não é exibida porque essa instrução é aninhada dentro de muitas cláusulas "then". Sugiro simplificar a lógica da seguinte forma:
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
Em seu código original, /tmp/log
está sendo atualizado com tee -a
ao mesmo tempo em que é substituído por mount
. Isso provavelmente não é confiável. O código acima evita isso.
P.S. Como depurar: Se o código "travar", provavelmente é porque mount
trava ao tentar uma montagem NFS. Para saber com certeza, (a) adicione algumas declarações de echo
de diagnóstico, (b) exiba mount
output se houver (foi descartado no código acima) e (c) adicione a opção -v
a mount
para torná-lo detalhado. Também é possível remover a instrução tee
para que não haja problemas no buffer de saída. Assim, tente:
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
P.P.S. Manipulação de hosts que estão inativos: Ao lidar com montagens NFS, o comando mount
normalmente possui um tempo limite muito longo.nós hosts (mais de 2 minutos no meu sistema). Por contraste, ping
pode detectar se um host está inativo em segundos. Portanto, para evitar o longo tempo limite de mount
, pode-se primeiro testar se o host está usando ping
. Para fazer isso, substitua a linha mount -t nfs...
por:
ping -c2 "$ip" >/dev/null && mount -t nfs -o ro,nolock "$ip:/opt/media/" /mount/stack &>/dev/null
Isso, obviamente, pressupõe que você esteja em uma rede que permite que os hosts respondam aos pings.