Jede Minute wird geprüft, ob das Auslesen des Wechselrichters länger als 1 Minute zurück liegt und wenn ja, der komplette Dockercontainer neugestartet, sprich: Spätestens nach 2 Minuten wird ein Scriptfehler bemerkt.
Startet er den Container neu, wird ein Eintrag im Log hier vorgenommen:
/home/dockeruser/solaranzeige/data/www/log/watchdog.log
Nachteile:
* Das WR-Script wird modifiziert, sprich: Nach Update ist es weg.
* Sehr effizient ist es auch nicht.
* Die Uhrzeiten von Host und Container müssen synchron sein, sonst knallts. Wenns nicht rund läuft, mit Maxage etwas großzügiger sein.
* Bevor irgendetwas an dem Docker gearbeitet wird, was das Anlegen der Datei verhindert muss der Watchdog gestoppt werden, sonst ist kein Arbeiten möglich. Als Hilfe ist aktuell eingebaut: Wenn die Datei fehlt, wird der Container nicht neugestartet. Es funktioniert also, vor den Arbeiten die Datei zu löschen (das erste Auslesen schaltet dann den Watchdog selbst wieder "scharf")
Gedanken:
* Sauberer wäre es, die Influx-DB abzufragen und hier zu schauen, ob frische Daten vom Wechselrichter eintrudeln. Feel free!
Schritt 1:
Im Container wird am Ende des Scripts eine Datei angelegt, bzw. erneuert.
Kann die Datei nicht angelegt werden, wird ein Fehler ins Log geschrieben.
Am Ende des Scripts für den Wechselrichter (zB sma_wr.php) in die Zeile vor "return;" Folgendes einfügen:
Code: Alles auswählen
$watchdogfile = $Pfad."/database/".$GeraeteNummer.".ImNotDead.txt";
$rc = file_put_contents($watchdogfile,"0");
if ($rc === false) {
$funktionen->log_schreiben("Konnte die Watchdog-Datei nicht anlegen."," ",5);
}
Schritt 2:
/home/dockeruser/solaranzeige/data/www/html/database/solanz_watchdog.sh auf dem host anlegen, chmod +s nicht vergessen und mit Folgendem füllen:
Code: Alles auswählen
#!/bin/bash
# Script prüft, ob Watchdog-Datei älter als 1 Minute und falls ja, startet docker Solaranzeige neu.
# Modifizieren nach eigenen Wünschen
function comparedate() {
if [ ! -f $1 ]; then
# Prüft ob Datei vorhanden, falls nicht > Ende. Durch Löschen der Datei kann so der Watchdog temporär unscharf geschaltet werden.
exit 1
fi
MAXAGE="65" #Maximal valides Alter in Sekunden (65 beugt Schwankungen vor, das Script läuft 1x pro Minute)
FILEAGE=$(($(date +%s) - $(stat -c '%Y' "$1")))
test $FILEAGE -lt $MAXAGE && {
# Ist die Datei frisch, passiert nichts.
return 0
}
# Ist die Datei zu alt, wird die Datei gelöscht und der Container neu gestartet.
# Löschen der Datei verhindert Probleme, falls das Script für den Neustart länger braucht, als die nächste Prüfung.
rm /home/dockeruser/solaranzeige/data/www/html/database/1.ImNotDead.txt
/usr/bin/docker container restart Solaranzeige
echo "Neustart durch Watchdog initiiert: "`date` >> /home/dockeruser/solaranzeige/data/www/log/watchdog.log
return 1
}
comparedate /home/dockeruser/solaranzeige/data/www/html/database/1.ImNotDead.txt
Schritt 3:
crontab -e (Bei einem User, der Container neustarten darf!)
Zeile einfügen:
Code: Alles auswählen
* * * * * bash /home/dockeruser/solaranzeige/data/www/html/database/solanz_watchdog.sh