Avviso di caduta della connessione Internet


9

Quale software è presente che riprodurrà un avviso (altoparlante del PC) quando non c'è alcuna connessione a Internet per 5 minuti?

Il mio switch / router sembra disconnettersi ogni pochi giorni e voglio ripristinarlo quando succede.

PC          -- TP-Link switch/router -- FO
192.168.x.1 -- 192.168.x.2 / x.y.z.a -- a.b.c.d

3
Non per evidenziare l'ovvio, ma stai prendendo una soluzione molto rotonda al problema di un interruttore / router difettoso
Michael Mrozek

Risposte:


7

Puoi usare una versione modificata di questo script per fare quello che vuoi:

#!/bin/bash

downTime=0
lastAccessTime=$(date +"%s")
while [ true ]; do
if ! ping -c1 google.com >& /dev/null; then
    downTime=$(( $(date +"%s") - $lastAccessTime ))
else
    downTime=0
    lastAccessTime=$(date +"%s")
fi

sleep 15

if [ $downTime -ge 300 ]; then
   echo "alert"
fi
done

Siamo un esempio di "CONNESSO"

Con il debug attivato in modo da poter vedere cosa sta facendo lo script.

set -x

In esecuzione con un nome host valido per dimostrare lo stato "connessione in corso".

$ ./watcher.bash
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955
+ '[' true ']'

Quanto sopra inizializza un paio di variabili e determina l'ultima volta che siamo andati attraverso il ciclo, $lastAccessTime. Ora proviamo a eseguire il ping di Google.

+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276955

Ora calcoliamo i tempi di $downTimeinattività, se il ping fallisce, altrimenti ripristiniamo $downTimea zero e ricalcoliamo $lastAccessTime.

+ sleep 15

Ora aspettiamo 15 secondi.

+ '[' 0 -ge 300 ']'

Ora controlliamo se siamo rimasti inattivi per> 5 minuti (300 secondi). Quindi ripetiamo di passare attraverso il whileciclo.

+ '[' true ']'
+ ping -c1 google.com
+ downTime=0
++ date +%s
+ lastAccessTime=1402276970
+ sleep 15
....

Finché siamo attivi, non succederà nulla se non controlliamo il pingcomando ogni 15 secondi.

Siamo "DISCONNECTED" Esempio

Ora per simulare una "connessione è giù" stato, faremo scambiare l'hostname stiamo pinging e utilizzare un falso uno, google1234567890.com. Ripetendo un'esecuzione del nostro script con il debug abilitato, ora vediamo calcolare alcuni tempi di inattività effettivi.

$ ./watcher.bash
+ downTime=0
++ date +%s
+ lastAccessTime=1402277506
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=0
+ sleep 15
+ '[' 0 -ge 300 ']'
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=15
+ sleep 15
...

Si noti che $downTimefinora è pari a 15 secondi. Se aspettiamo ancora un po 'vedremo questo:

+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=300
+ sleep 15

Abbiamo accumulato 300 secondi di inattività. Così ora quando controlliamo il risultato della stampa il messaggio, alert.

+ '[' 300 -ge 300 ']'
+ echo alert
alert
+ '[' true ']'
+ ping -c1 google1234567890.com
++ date +%s
+ downTime=315
+ sleep 15

Questo stato continuerà fino al ripristino della connessione e al pingsuccesso.

E che dire di un suono?

Questo è facile. È possibile utilizzare una varietà di strumenti per farlo. Vorrei usare qualcosa di simile soxo mplayerper riprodurre un file audio come un file .mp3o .wavcon un suono appropriato che si desidera ascoltare ogni 15 secondi, mentre la connessione non è attiva.

mplayer someaudio.wav

Sostituisci semplicemente il alertmessaggio sopra con questa linea per ottenere un feedback audio che la connessione non è attiva.

Problemi di timeout con ping

Se lo usi pingnel modo sopra, probabilmente ti imbatterai in un ritardo lento in cui occorrono pingletteralmente 10-20 secondi perché fallisca quando la connessione è inattiva. Vedi la mia risposta a queste domande e risposte U&L intitolata: Come reindirizzare l'output di qualsiasi comando? ad esempio usando finginvece lo strumento da riga di comando . Questo strumento fallirà più rapidamente rispetto al tradizionale ping.


A proposito sto usando il beepcomando, è sicuro chown /dev/tty0così potrei usarlo senza sudo?
Kokizzu,

1
@Kokizzu - no, non dovresti cambiarne la proprietà /dev/tty0.
slm

1
Evviva sox! @Kokizzu - slm ha ragione a lasciare le autorizzazioni sul /dev/tty0dispositivo da solo, ma potresti ottenere un dispositivo pseudo-terminale /dev/pts/[num] - lo stesso tipo di dispositivo a caratteri che xtermutilizza per ogni finestra, ad esempio - con qualcosa di simile screeno tmuxo addirittura ssh. Questi possono essere controllati in modo più sicuro in quanto sono comunque solo dispositivi slave sul dispositivo master /dev/ptmxe non causeranno lo stesso tipo di problemi che, ad esempio, /bin/loginpotrebbe essere un processo di proprietà dell'utente - che è ciò che potrebbe accadere nell'altro caso.
Mikeserv,

aplay alert.wavè un modo più standard per riprodurre l'audio in quanto fa parte del sistema ALSA e viene pre-assemblato nella maggior parte delle distribuzioni.
Ray Foss,

4

se stai usando Linux puoi usare il ping all'interno di uno script google.comper esempio:

counter=0
while [ true ]
do
ping -c 1 google.com > /dev/null 2>&1
if [ $? -ne 0 ] 
then
    let "counter +=1"
else
    let "counter = 0"
fi
if [ $counter -eq 300 ] # we assume that one ping need one second (300 is 5 minutes)
then
   echo "alert"
fi
done

3
Funzionerà, ma potresti prendere in considerazione l'utilizzo al fingposto di ping. Il pingcmd. può volerci un po 'per fallire quando non ha successo. Il fingcomando invece fallirà entro 1 secondo. Vedi la mia A a queste domande e risposte per ulteriori informazioni: Come reindirizzare l'output di qualsiasi comando? . Mostro sia utilizzando pinge fing.
slm

@slm, Grazie per il tuo editing, ero confuso su come far durare il ping solo per un secondo
Nidal

Sembra che eseguirà il ping un numero illimitato di volte al secondo se risponde immediatamente, ad esempio quando l'ethernet perde potenza. sleep 1è abbastanza per impedirlo.
Ray Foss,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.