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.