Ich möchte also meine Netzwerkkonnektivität im Auge behalten, damit ich einen Bericht für meinen ISP erstellen kann. (Es scheint, als ob das Modem etwa einmal am Tag für etwa 30–60 Sekunden ausfällt.)
Also habe ich dieses praktische kleine Skript kopiert
Und es läuft mit
watch -n 15 ./ping-test.sh
Ich habe es getestet, indem ich den Stecker meines Modems gezogen habe.
Wenn Watch das Skript zum ersten Mal nach einem Netzwerkausfall ausführt, läuft es einwandfrei (sendet einige E-Mails) und funktioniert dann nicht mehr. Sobald das Netzwerk wiederhergestellt ist, wird das Skript „beendet“ und Watch führt es erneut aus.
Ich erhalte also E-Mails, wenn das Netzwerk ausfällt, aber nicht, wie lange es ausgefallen ist.
Wenn ich das Skript direkt von der Befehlszeile aus ausführe, wird es ausgeführt (E-Mails) und dann beendet.
Irgendwelche Ideen, warum das so ist? Wie kann ich dafür sorgen, dass das Skript weiter ausgeführt wird, wenn das Netzwerk ausgefallen ist?
Antwort1
Klingelnbleibt hängen, wenn es sein Ziel nicht erreichen kann, und das ist vielleicht der Grund, warum das Skript nicht mehr funktioniert, weil dasKlingelnwartet noch auf eine Antwort. Versuchen Sie, die-w Fristoder-W AuszeitOption auf dieKlingeln.
Antwort2
Sie können dies in Echtzeit tun, indem Sie „IP-Monitor“ verwenden. Dadurch werden alle Ereignisse ausgegeben, z. B. das Entfernen oder Hinzufügen einer IP-Adresse, der Wechsel des Verbindungsstatus von „betriebsbereit“ zu „getrennt“ oder eine Routenänderung auf andere Weise.
ip monitor all >> /some/log.log &
Sie müssen im Anfügemodus öffnen. Wenn Sie es außerhalb des Terminals laufen lassen möchten, können Sie den Job einfach mit „disown %1“ ablehnen.
Wenn Sie auch Zeitstempel benötigen, gibt es mehrere Möglichkeiten. Eine einfache Möglichkeit besteht darin, mit inotifywait zu prüfen, ob die Datei aktualisiert wird, und dann Ihr Datum daran anzuhängen. Es wäre einfach, das oben genannte und dies in ein Shell-Skript zu integrieren und dieses stattdessen vielleicht zu disownen, sodass Sie Folgendes erhalten:
ip monitor all >> /some/log.log &
while inotifywait -qq -e modify /some/log.log; do
sleep 0.2;
date >>/root/mon.log;
done
Genießen
Antwort3
Ihre Lösung mit dem Befehl „watch“ ist nicht gut. Ich würde versuchen, das Problem mit etwas wie Folgendem zu lösen:
#!/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
und führen Sie es dann als normales Skript aus: ./script_name.sh
Beenden mit STRG+C.
Antwort4
Es wird ungültig, da es bereits beendet ist, aber von einem übergeordneten Prozess ( watch
Befehl) abhängt, der noch aktiv ist.
Ich erhalte also E-Mails, wenn das Netzwerk ausfällt, aber nicht, wie lange es ausgefallen ist.
Dieses Skript druckt bereits das Datum aus, an dem das Remote-System ausgefallen ist:
echo "Host : $myHost is down (ping failed) at $(date)" | mail -s "$SUBJECT" $EMAILID
Wie kann ich erreichen, dass das Skript weiter ausgeführt wird, wenn das Netzwerk ausgefallen ist?
Es wird ping
mit gesendet, -c 1
sodass es nach dem Senden eines ECHO_REQUEST-Pakets stoppt.
Fügen Sie es in Cron ein, damit es jede Minute ausgeführt wird:
*/1 * * * * /path/to/your/script