Alerte de perte de connexion Internet

9

Quel logiciel existe-t-il qui émettra une alerte (haut-parleur PC) lorsqu'il n'y a pas de connexion Internet pendant 5 minutes?

Mon commutateur / routeur semble se déconnecter tous les quelques jours et je veux le réinitialiser quand cela se produit.

PC          -- TP-Link switch/router -- FO
192.168.x.1 -- 192.168.x.2 / x.y.z.a -- a.b.c.d
Kokizzu
la source
3
Pour ne pas souligner l'évidence, mais vous prenez une solution très détournée au problème d'un commutateur / routeur défectueux
Michael Mrozek

Réponses:

7

Vous pouvez utiliser une version modifiée de ce script pour faire ce que vous voulez:

#!/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

Nous sommes "CONNECTED" Exemple

Le débogage étant activé, vous pouvez voir ce que fait le script.

set -x

Exécution avec un nom d'hôte valide pour démontrer l'état "connexion établie".

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

Le ci - dessus quelques initialise des variables et détermine la dernière fois que nous sommes allés dans la boucle, $lastAccessTime. Nous essayons maintenant d'envoyer une requête ping à Google.

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

Nous calculons maintenant tout temps d'arrêt $downTime, si le ping échoue, sinon, nous remettons $downTimeà zéro et recalculons $lastAccessTime.

+ sleep 15

Maintenant, nous attendons 15 secondes.

+ '[' 0 -ge 300 ']'

Maintenant, nous vérifions si nous sommes en panne depuis> 5 minutes (300 secondes). Ensuite, nous répétons en parcourant la whileboucle.

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

Tant que nous sommes debout, il ne se passera rien d'autre que de vérifier avec la pingcommande toutes les 15 secondes.

Nous sommes "DÉCONNECTÉS" Exemple

Maintenant , pour simuler une « connexion est en panne » état, nous échangeons le nom d' hôte et nous utilisons pinger un faux, google1234567890.com. En répétant une exécution de notre script avec le débogage activé, nous voyons maintenant des temps d'arrêt réels calculés.

$ ./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
...

Notez au-dessus de cela $downTimeest égal à 15 secondes jusqu'à présent. Si nous attendons encore un peu, nous verrons ceci:

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

Nous avons accumulé 300 secondes de temps d'arrêt. Alors maintenant , quand nous vérifions, nous imprimons le message, alert.

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

Cet état se poursuivra jusqu'à ce que la connexion soit rétablie et pingréussisse à nouveau.

Et le son?

C'est facile. Vous pouvez utiliser une variété d'outils pour ce faire. J'utiliserais quelque chose comme soxou mplayerpour lire un fichier audio tel qu'un fichier .mp3ou .wavavec un son approprié que vous souhaitez entendre toutes les 15 secondes, alors que la connexion est coupée.

mplayer someaudio.wav

Remplacez simplement le alertmessage ci-dessus par cette ligne pour obtenir un retour audio indiquant que la connexion est interrompue.

Délais de temporisation avec ping

Si vous utilisez pingde la manière ci-dessus, vous rencontrerez probablement un retard lent où il faut pinglittéralement 10 à 20 secondes pour qu'il échoue lorsque la connexion est coupée. Voir ma réponse à cette Q&R U&L intitulée: Comment rediriger la sortie d'une commande? pour un exemple utilisant l'outil de ligne de commande à la fingplace. Cet outil échouera plus rapidement que le traditionnel ping.

slm
la source
Btw J'utilise la beepcommande, est-ce sûr pour chown /dev/tty0que je puisse l'utiliser sans sudo?
Kokizzu
1
@Kokizzu - non, vous ne devriez pas changer de propriétaire /dev/tty0.
slm
1
Hourra sox! @Kokizzu - slm a raison de laisser les autorisations sur le /dev/tty0périphérique seul, mais vous pouvez obtenir un périphérique pseudo-terminal /dev/pts/[num] - le même type de périphérique de caractères qui xtermutilise pour chaque fenêtre, par exemple - avec quelque chose comme screenou tmuxou même ssh. Vous pouvez les contrôler plus en toute sécurité car ils ne sont de toute façon que des périphériques esclaves du périphérique maître /dev/ptmxet ne causeront pas le même type de problèmes que, par exemple, un /bin/loginprocessus appartenant à l'utilisateur - ce qui pourrait arriver dans l'autre cas.
mikeserv
aplay alert.wavest un moyen plus standard de jouer du son car il fait partie du système ALSA et est pré-groupé dans la plupart des distributions.
Ray Foss
4

si vous utilisez Linux, vous pouvez utiliser ping dans un script pour google.compar exemple:

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
Nidal
la source
3
Cela fonctionnera, mais vous voudrez peut-être envisager d'utiliser fingau lieu de ping. Le pingcmd. peut échouer un peu en cas d'échec. La fingcommande sur le otherhand échouera à moins de 1 seconde. Voir mon A à ce Q & A pour plus: Comment rediriger la sortie d'une commande? . Je montre à la fois en utilisant pinget fing.
slm
@slm, Merci pour votre édition, je ne savais pas comment faire durer le ping seulement pendant une seconde
Nidal
Il semble que cela exécutera le ping un nombre illimité de fois par seconde s'il répond immédiatement, par exemple lorsque Ethernet perd de la puissance. sleep 1suffit pour éviter cela.
Ray Foss