Ubuntu 16.04 como usar ping em um script bash para decidir se pular um bloco de código

2

Eu tenho registradores de dados espalhados pelo sistema de energia solar e um único programa que funciona à meia-noite para coletar os dados do dia e colocá-los em um disco rígido.

O script bash no servidor Ubuntu percorre 7 unidades Raspbian que possuem os dados coletados e os colocam no lugar apropriado no disco rígido, nos diretórios nomeados pelas unidades que estão por aí. Eu descobri como pegar os nomes genéricos hoje.dat e today.png e salvá-los com a data do dia no arquivo como 2017-08-10.png e 2017-08-10.dat

- > Ocasionalmente, uma das unidades não responde devido a algum problema ou outro, e bloqueia a execução do programa.

Por isso, gostaria de usar o ping para testar se o sistema responde antes de decidir se quero coletar dados dele.

Os nomes dos meus sistemas estão todos no arquivo / etc / hosts, então eu os referenciei pelo nome.

Para os fins desta questão, estou verificando o SOLAR - aquele que monitora o comportamento do controlador de carregamento e do inversor.

Veja o que tentei:

if $( ping -c 1 SOLAR | grep icmp* | wc -l ) eq 0
then
   (do stuff like ssh -e "gnuplot makepng" then scp the png and raw data)
fi

(muito complicado)

e

if [ $(ping -c 1 SOLAR >/dev/null) eq 0 ]
    then do the stuff
fi

(parece OK, mas não entendo a necessidade dos colchetes)

Deve haver uma maneira melhor.

Espero fazer algo mais como

if $(ping -c 1 SOLAR) eq 0
then
   (do stuff)
else
   (then maybe echo "SOLAR didn't respond" | ssmtp [email protected]
fi

Eu não programei bash em algumas décadas - usei shell C na maior parte do tempo. E estou recebendo dicas demais sobre a melhor maneira de fazer isso.

Então, alguém pode sugerir uma maneira simples de fazer isso?

    
por SDsolar 11.08.2017 / 07:14

1 resposta

2

Parece que você está interessado apenas no status de saída de ping , ou seja, se está recebendo o ICMP ECHO_RESPONSE do host para o seu ECHO_REQUEST; você pode fazer apenas ping -c 1 ... e ping sairá com status 0 se o host estiver enviando resposta, 1 se não houver resposta e 2 para host desconhecido.

Você pode facilmente usar isso com if construct; você não precisa contar a resposta, basta usar a condição ping as if , pois if avaliaria o status de saída de ping para prosseguir para qualquer ramificação definida:

if ping -c 1 SOLAR &>/dev/null; then
    ## Reachable -- do stuffs
else
    ## Unreachable -- do other stuffs
fi

Estou redirecionando os fluxos STDOUT e STDERR de ping para /dev/null , pois não estamos interessados neles.

    
por heemayl 11.08.2017 / 07:26