Watchdog für Scripte im Container

Solaranzeige und Docker
Alles was mit der Docker Version zu tun hat.

Moderatoren: Ulrich, DeBaschdi

Antworten
jottt
Beiträge: 97
Registriert: Mo 1. Mär 2021, 00:18
Hat sich bedankt: 10 Mal
Danksagung erhalten: 10 Mal

Watchdog für Scripte im Container

Beitrag von jottt »

Eine kurze Anleitung für einen nicht sehr schlauen, aber funktionalen Watchdog.
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

DeBaschdi
Beiträge: 157
Registriert: Mo 10. Aug 2020, 08:13
Hat sich bedankt: 7 Mal
Danksagung erhalten: 22 Mal

Re: Watchdog für Scripte im Container

Beitrag von DeBaschdi »

Moin, eine Alternative zur "aufwendigen" Bearbeitung der Wechselrichter Skript-Dateien wäre das InfluxDB Log auszuwerten, oder simpler das letzte Änderungsdatum dieser mit der aktuellen Systemzeit in Epoch zu vergleichen (%s seconds since 1970-01-01 00:00:00 UTC), bei Differenz >65 Restart.

Code: Alles auswählen

root@caf9155bbbdc:/var/www/log# date -r influxdb.log +%s
1616037482
root@caf9155bbbdc:/var/www/log# date +%s
1616037504
Ich könnte im Container einen Watchdog einbauen, finde das alles aber irgendwie "dirty"

Code: Alles auswählen

root@caf9155bbbdc:/var/www/log# tail -n 3 influxdb.log
[httpd] 127.0.0.1 - - [18/Mar/2021:04:22:02 +0100] "POST /write?db=solaranzeige&precision=s HTTP/1.1" 204 0 "-" "-" 1b6c3161-8799-11eb-8630-0242ac11000c 16808
[httpd] 127.0.0.1 - - [18/Mar/2021:04:23:01 +0100] "POST /write?db=solaranzeige&precision=s HTTP/1.1" 204 0 "-" "-" 3ee30fcf-8799-11eb-8631-0242ac11000c 3346
[httpd] 127.0.0.1 - - [18/Mar/2021:04:24:02 +0100] "POST /write?db=solaranzeige&precision=s HTTP/1.1" 204 0 "-" "-" 62fabd68-8799-11eb-8632-0242ac11000c 6292

jottt
Beiträge: 97
Registriert: Mo 1. Mär 2021, 00:18
Hat sich bedankt: 10 Mal
Danksagung erhalten: 10 Mal

Re: Watchdog für Scripte im Container

Beitrag von jottt »

Das hatte ich auch überlegt, weil es etwas einfacher ist.
Hat aber 2 Nachteile:
* Wenn mehrere Scripte (Wetter, Ladestation,etc) laufen, merkt er nicht mehr, falls der Wechselrichter stecken bleibt.
* Der Watchdog wird eventuell nach einem Neustart des Containers stolpern, weil es zu lange dauert, bis die DB geschrieben wird.(Gefahr von endlosen Neustarts)


Dreckig ist es, aktuell aber meine Einzige Chance überhaupt Daten zu bekommen. Das System bleibt bei mir täglich, meist mehrfach, stehen.

jottt
Beiträge: 97
Registriert: Mo 1. Mär 2021, 00:18
Hat sich bedankt: 10 Mal
Danksagung erhalten: 10 Mal

Re: Watchdog für Scripte im Container

Beitrag von jottt »

Kurzer Testbericht: Bisher keine Auffälligkeiten, dafür schon 3* ordentlich gearbeitet und mir den ersten sauberen Graphen seit Wochen geliefert :)

Code: Alles auswählen

Neustart durch Watchdog initiiert: Do 18. Mär 10:40:12 CET 2021
Neustart durch Watchdog initiiert: Do 18. Mär 11:33:12 CET 2021
Neustart durch Watchdog initiiert: Do 18. Mär 13:52:12 CET 2021

DeBaschdi
Beiträge: 157
Registriert: Mo 10. Aug 2020, 08:13
Hat sich bedankt: 7 Mal
Danksagung erhalten: 22 Mal

Re: Watchdog für Scripte im Container

Beitrag von DeBaschdi »

Hallo @jottt,
Du hast recht, ich hätte aber noch eine Idee :

Kannst du dir bitte mal das Bash programm "timeout" anschauen ?
Möglicherweise lässt sich das ins Crontab mit einbauen

Code: Alles auswählen

*     *  *  *  *    /pfad/zur/timeout 60 /var/www/html/regler_auslesen.php
http://manpages.ubuntu.com/manpages/tru ... out.1.html

https://exceptionshub.com/how-to-kill-a ... -bash.html

jottt
Beiträge: 97
Registriert: Mo 1. Mär 2021, 00:18
Hat sich bedankt: 10 Mal
Danksagung erhalten: 10 Mal

Re: Watchdog für Scripte im Container

Beitrag von jottt »

Gute Idee.

Ich habe erstmal einen Testlauf mit time gesetzt um zu beobachten, was die übliche Laufzeit ist, und ob ein Timeout funktionieren könnte.

Code: Alles auswählen

*     *  *  *  *    (time /var/www/html/regler_auslesen.php;) |& grep real >> /var/www/log/timer
Ob das am Ende klappt müssen wir dann schauen, denn wenn das Script stehen bleibt und ich töte einfach den Prozess läuft regler_auslesen zwar wieder an, aber produziert Fehler, statt Daten. Ich fürchte, da hängt noch irgendein Port fest oder so.

Problem & Bugreport:
Die Crontab überlebt ein docker container restart nicht. Danach sind die Änderungen weg.

DeBaschdi
Beiträge: 157
Registriert: Mo 10. Aug 2020, 08:13
Hat sich bedankt: 7 Mal
Danksagung erhalten: 22 Mal

Re: Watchdog für Scripte im Container

Beitrag von DeBaschdi »

Hast du das exportierte {SOLARANZEIGE_STORAGE}/solaranzeige_cron editiert ? ;)

jottt
Beiträge: 97
Registriert: Mo 1. Mär 2021, 00:18
Hat sich bedankt: 10 Mal
Danksagung erhalten: 10 Mal

Re: Watchdog für Scripte im Container

Beitrag von jottt »

aaach.... es war spät. Natürlich nicht. Ich dachte allerdings auch, dass crontab -e Die Änderungen persistent speichert.

jottt
Beiträge: 97
Registriert: Mo 1. Mär 2021, 00:18
Hat sich bedankt: 10 Mal
Danksagung erhalten: 10 Mal

Re: Watchdog für Scripte im Container

Beitrag von jottt »

So ich habs mal umgebaut und bei mir funktioniert es auch schon ganz tauglich.

Watchdog mit Timeout IM Container (für Pi und Docker). Verlust von Maximal 1 Minute an Daten. Kein Neustart der Umgebung.
Nachteil aktuell: Auch hier muss am Quellcode etwas geändert werden, denn die Prüfung auf schon laufende Scripte scheint den timeout-Prozess zu sehen und quittiert die Scripte sofort.

Gedanken: Ich weiß nicht, was passiert, wenn dieses Script getötet wird, während es Daten in die Influx schreibt...könnte hässlich werden. Kennt sich da jemand aus?

Code: Alles auswählen

*  *  *  *  *    /usr/bin/timeout 59 /var/www/html/multi_regler_auslesen.php 2>&1 >/dev/null ||echo -e Timeout at `date` >> /var/www/log/watchdog.log
# *  *  *  *  *    /usr/bin/timeout 59 /var/www/html/regler_auslesen.php 2>&1 >/dev/null ||echo -e Timeout at `date` >> /var/www/log/watchdog.log
Änderungen:
in der multi_regler_auslesen.php bzw. regler_auslesen.php muss die Prüfung auf laufende Scripte demoliert werden:

Folgende Zeile auskommentieren

Code: Alles auswählen

$runningScript = $_SERVER['SCRIPT_NAME'];

Antworten