Linux se elif mais falhar

1

Estou tentando descobrir se o ponto de montagem 1 está disponível e, se não, o monte. Se o ponto de montagem 1 falhar, monte o segundo. Se isso falhar, exiba uma mensagem de falha.

Aqui está o código:

mount > /tmp/log;
if grep -ohw 123.456.789 /tmp/log >/dev/null; then echo -e " STACK MOUNT \e[1;33mALREADY\e[00m AVAILABLE \e[1;33mPASSED\e[00m ";
elif mount -t nfs -o ro,nolock 123.456.789:/opt/media/ /mount/stack &>/dev/null; then mount > /tmp/log;
if grep -ohw 123.456.789 /tmp/log >/dev/null; then echo -e " STACK MOUNT AVAILABLE \e[1;33mPASSED\e[00m ";
elif mount -t nfs -o ro,nolock 223.456.789:/opt/media/ /mount/stack &>/dev/null; then mount > /tmp/log;
if grep -ohw 223.456.789 /tmp/log >/dev/null; then echo -e " STACK MOUNT AVAILABLE \e[1;33mPASSED\e[00m ";
else echo -e " STACK MOUNT NOT AVAILABLE          \e[00;31mFAILED\e[00m"; fi; fi; fi | tee -a /tmp/log

Se algum dos pontos de montagem dos 2 estiver montado, o resultado é bom. O problema é quando nenhum dos pontos de montagem é montado, a instrução FAILURE não é exibida.

    
por user2692634 04.04.2014 / 06:21

3 respostas

2

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.

    
por 04.04.2014 / 07:11
1

Isso se resume a colocação "fi". Se você planeja o seu script mais formalmente, fica mais aparente - o primeiro bloco 'if' / 'elif' não é completado até o terceiro 'fi'. A partir da sua descrição do requisito, eu esperaria 'if / elif / fi, if / elif / fi, if / else / fi'.

Como Slartibartfast apontou, pode ser mais legível / sustentável para reestruturá-lo em uma única cadeia if / elif / elif ... / else / fi, mas como você o estruturou, você pode consertá-lo movendo a 'fi é depois e deixando o resto como é.

Código atual, com formatação:

mount > /tmp/log;
if grep -ohw 123.456.789 /tmp/log >/dev/null;
then
    echo -e " STACK MOUNT \e[1;33mALREADY\e[00m AVAILABLE \e[1;33mPASSED\e[00m ";
elif mount -t nfs -o ro,nolock 123.456.789:/opt/media/ /mount/stack &>/dev/null;
then
    mount > /tmp/log;
    if grep -ohw 123.456.789 /tmp/log >/dev/null;
    then
        echo -e " STACK MOUNT AVAILABLE \e[1;33mPASSED\e[00m ";
    elif mount -t nfs -o ro,nolock 223.456.789:/opt/media/ /mount/stack &>/dev/null;
    then
        mount > /tmp/log;
        if grep -ohw 223.456.789 /tmp/log >/dev/null;
        then
            echo -e " STACK MOUNT AVAILABLE \e[1;33mPASSED\e[00m ";
        else
            echo -e " STACK MOUNT NOT AVAILABLE          \e[00;31mFAILED\e[00m";
        fi;
    fi;
fi | tee -a /tmp/log

Como isso mostra, se a montagem original não estiver lá e o primeiro comando de montagem falhar, sairemos de todo o bloco 'if' - não é possível que nenhum código seja executado.

    
por 04.04.2014 / 07:12
0

Muitos ifs.

if A; then B
elif C; then D
elif E; then F
else G
fi

Espero que ajude.

Além disso, para as tarefas que você precisa concluir em sequência, garantindo que todas as tarefas sejam concluídas com êxito, você pode tentar participar das tarefas com & & Isso fará com que os comandos sejam executados em sequência, parando apenas se (e quando) um falhar, retornando o código de saída do último comando executado:

mount squiggle && mount > /tmp/log && grep squiggle >/dev/null && echo -e "squiggle";

O comando acima tentará mount squiggle desistir com um erro / falha, se não. Se for bem-sucedido, ele executará o comando mount, transmitindo para / tmp / log. Se esse comando falhar, ele será encerrado com um erro. Caso contrário, o comando grep será executado ...

    
por 04.04.2014 / 06:45