Verwenden von watch zum Ausführen eines Shell-Skripts - das Skript funktioniert jedoch nicht mehr

Verwenden von watch zum Ausführen eines Shell-Skripts - das Skript funktioniert jedoch nicht mehr

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

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

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 ( watchBefehl) 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 pingmit gesendet, -c 1sodass 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

verwandte Informationen