Portanto, quero ficar de olho na conectividade da minha rede para poder fazer um relatório para o meu ISP. (parece que o modem fica desligado por cerca de 30 a 60 segundos, uma vez por dia)
Então copiei este pequeno script útil
E executá-lo com
watch -n 15 ./ping-test.sh
Eu tenho testado puxando o plugue do meu modem.
A primeira vez que watch executa o script depois que a rede é desligada, ele funciona bem (envia algum e-mail) e depois desaparece. Depois que a rede for restaurada, o script "terminará" e o watch será executado novamente.
Então, estou recebendo mensagens para quando a rede cair, mas não por quanto tempo ela ficou fora do ar.
Se eu executar o script diretamente da linha de comando, ele será executado (e-mails) e depois sairá.
Alguma idéia do porquê? Como posso fazer com que o script continue em execução quando a rede estiver inoperante?
Responder1
pingarirá travar se não conseguir atingir seu alvo e talvez por isso o script seja extinto porque opingarainda está esperando uma resposta. Tente adicionar o-c prazo finalou-C tempo esgotadoopção para opingar.
Responder2
Você pode fazer isso em tempo real usando o "monitor ip". Isso gerará quaisquer eventos, como o endereço IP sendo removido ou adicionado, o estado do link mudando de operacional para desconectado ou uma rota mudando de alguma forma.
ip monitor all >> /some/log.log &
Você deve abrir no modo anexar. Se você quiser deixá-lo rodar fora do terminal, você pode simplesmente rejeitar o trabalho com "disown% 1"
Se você também precisar de carimbos de data e hora, há algumas maneiras. Uma maneira fácil é usar inotifywait para verificar se o arquivo foi atualizado e, em seguida, anexar sua data a ele. Seria fácil fazer o que foi dito acima e isso em um script de shell e talvez rejeitá-lo para que você obtenha
ip monitor all >> /some/log.log &
while inotifywait -qq -e modify /some/log.log; do
sleep 0.2;
date >>/root/mon.log;
done
Aproveitar
Responder3
Sua solução com o comando 'watch' não é boa. Eu tentaria resolver isso com algo assim:
#!/bin/bash
HOSTS="foo.bar foo2.bar"
COUNT=4
while :
do
for myHost in $HOSTS
do
count=$(ping -c $COUNT $myHost | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
if [ $count -eq 0 ]; then
# 100% failed
echo "Host : $myHost is down (ping failed) at $(date)"
fi
done
sleep 15 # here is your refresh rate
done
e execute-o como um script normal: ./script_name.sh
termine com CTRL+C.
Responder4
Ele desaparece porque já foi concluído, mas depende de um processo pai - watch
comando que ainda está ativo.
Então, estou recebendo mensagens para quando a rede cair, mas não por quanto tempo ela ficou fora do ar.
Esse script já imprime a data em que o sistema remoto caiu:
echo "Host : $myHost is down (ping failed) at $(date)" | mail -s "$SUBJECT" $EMAILID
Como posso fazer com que o script continue em execução quando a rede estiver inoperante?
Ele está ping
funcionando -c 1
e irá parar após enviar 1 pacote ECHO_REQUEST.
Coloque-o no cron para executar a cada minuto:
*/1 * * * * /path/to/your/script