Usando watch para executar um script de shell - mas o script fica extinto

Usando watch para executar um script de shell - mas o script fica extinto

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

http://www.cyberciti.biz/tips/simple-linux-and-unix-system-monitoring-with-ping-command-and-scripts.html

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 - watchcomando 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á pingfuncionando -c 1e irá parar após enviar 1 pacote ECHO_REQUEST.

Coloque-o no cron para executar a cada minuto:

*/1 * * * * /path/to/your/script

informação relacionada