Modul zum senden von keep-alive Meldungen an systemd (watchdog)

Begonnen von hexenmeister, 20 August 2018, 21:29:02

Vorheriges Thema - Nächstes Thema

hexenmeister

Aus der Idee aus dem Forum (https://forum.fhem.de/index.php/topic,85231.0.html) entstanden und nach einer Testphase ins Repo eingecheckt (ab morgen per Update).

Das Modul erlaubt (mit einem passenden systemd-Script) eine Überwachung von FHEM mit Linux-systemd-Mitteln. Wird sich die FHEM-Instanz nicht innerhalb einer definierten Zeit melden (in Folge eines Abstutzes, 'Hängers' etc.), wird FHEM von systemd automatisch beendet und neu gestartet. Damit wird das System ein wenig robuster im Dauerbetrieb. Dennoch sollte man den Fällen, in denen der Watchdog zuschlägt, tunlichst nachgehen und die Problemursachen beseitigen.

Damit das funktioniert, muss FHEM unter der Kontrolle von systemd laufen und der Watchdog muss korrekt konfiguriert sein.
Folgendes Script kann dafür benutzt werden:
[Unit]
Description=FHEM Home Automation
Requires=network.target
#After=network.target
After=dhcpcd.service

[Service]
Type=forking
NotifyAccess=all
User=fhem
Group=dialout
# Run ExecStartPre with root-permissions
PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir -p /var/run/fhem
ExecStartPre=/bin/chown -R fhem:dialout /var/run/fhem
# Run ExecStart with defined user and group
WorkingDirectory=/opt/fhem
ExecStart=/usr/bin/perl fhem.pl fhem.cfg
#ExecStart=/usr/bin/perl fhem.pl configDB
TimeoutStartSec=240
TimeoutStopSec=120
#ExecStop=/usr/bin/pkill -U fhem perl
ExecStop=/usr/bin/pkill -f -U fhem "fhem.pl fhem.cfg"
# Restart options: no, on-success, on-failure, on-abnormal, on-watchdog, on-abort, or always.
Restart=on-failure
RestartSec=3
WatchdogSec=180
PIDFile=/var/run/fhem/fhem.pid

[Install]
WantedBy=multi-user.target

Das Script kann unter "/etc/systemd/system/fhem.service" angelegt werden.
Mit "sudo systemctl daemon-reload" wird sysgtemd-Konfiguration erneuert.
Anschliessend kann FHEM mit folgendem Befehl gestartet werden: "sudo systemctl start fhem.service".
Wenn in dem Script "Type=notify" verwendet wird, muss global Attribute "nofork=1" gesetzt sein.
attr global nofork 1
Bei "Type=forking" muss in Script der korrekte Pfad zu dem PID-Datei angegeben werden, diese Datei muss auch in FHEM mit dem global Attribute "pidfilename" aktiviert sein.
attr global pidfilename /var/run/fhem/fhem.pid

Die Definition für das Modul in FHEM ist sehr simpel und sollte vor dem aktivieren von Watchdog erstellt werden (save nicht vergessen!)

define <name> systemd_watchdog

Das war's auch schon. Viel Erfolg!

Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

wibi_

Servus,
vielen Dank für das Modul und die Anleitung! Ist genau das was ich gesucht habe, nachdem mein Garten einige Tage während meiner Abwesenheit trocken geblieben ist.

Etwas ist mir noch aufgefallen: Kann es sein, dass ein "shutdown restart" im FHEM Eingabefenster jetzt nur noch den Shutdown macht?
Ist aber eigentlich kein Prolem, wenn man das weiß. Kann ja FHEM auch wieder mit systemctl starten oder einfach einen reboot machen.

Gruß
RPI4, RPI3, RPI2, CULV3_HM, CULV3_FS20, CULV3_RFR, ZWave, 1-Wire, ESPEasy, Signalduino

hexenmeister

Moin, moin,

wie beschrieben, die Idee und die Funktionalität ist nicht von mir, ich habe nur das Ganze etwas bequemmer in ein Modul verpackt. Aber ich freue mich natürlich, dass das Modul jemandem nützlich ist :)
Bin dennoch kein Experte, was systemd angeht.
Bei mir verhält sich etwas anders. Egal, ob 'shutdown', oder 'shutdown restart', FHEM wird beendet und sofort vom systemd neu gestartet. Stört mich nicht weiter, soll ja auch immer laufen. Beenden kann ich auch mit systemctl.
Läuft bei Dir das Modul sonst wie gewünscht? Nach Abschuss von FHEM, nach deaktivieren/löschen des Modulinstanz oder nach einem simulierten Hänger startet nach der Wartezeit brav neu?
Arbeitest du mit forking oder mit notify?

Grüße
Alexander
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

wibi_

Hallo Alexander,

bin leider auch kein systemd - Experte. Ich habe fhem.service mit Type=forking und dem von mir oben beschriebenen Verhalten laufen.
Habe zwischenzeitlich auch mal mit Type=oneshot und RemainAfterExit=yes, sowie mit ExecReload=... wie hier beschrieben https://forum.fhem.de/index.php/topic,25706.0.html experimentiert - brachte aber auch nicht den gewünschten Erfolg.
Nach dem Abschuß (kill) von FHEM funktioniert alles wunderbar.
Was mich allerdings interessieren würde ist, wie ich einen Hänger von FHEM simulieren kann? Damit habe ich mich noch überhaupt nicht beschäftigt. Bin froh, wenn's läuft...

Gruß Harry

RPI4, RPI3, RPI2, CULV3_HM, CULV3_FS20, CULV3_RFR, ZWave, 1-Wire, ESPEasy, Signalduino

hexenmeister

Zitat von: wibi_ am 24 August 2018, 19:44:18
Was mich allerdings interessieren würde ist, wie ich einen Hänger von FHEM simulieren kann? Damit habe ich mich noch überhaupt nicht beschäftigt.

Nichts leichter als das ;D
sleep 300
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

wibi_

Hallo Alexander,

nach einigem Testen funktioniert das bei mir jetzt auch mit dem "sleep-Hänger". Ein Problem hatte ich mit der ExecStop Zeile der Unit. Diese lief bei mir auf einen Fehler.
Nachdem ich ExecStop wie folgt geändert habe, funktioniert der Watchdog jetzt auch beim sleep:

ExecStop=/usr/bin/pkill -f -x fhem.pl

Und wenn die ExecStartPre - Zeile noch um ein -p ergänzt wird, unterdrückt das die Fehlermeldung, wenn das Verzeichnis /var/run/fhem schon existiert - ist aber nur Kosmetik.

ExecStartPre=-/bin/mkdir -p /var/run/fhem

Danke nochmal für dieses Modul und deine Arbeit!

Gruß Harry


RPI4, RPI3, RPI2, CULV3_HM, CULV3_FS20, CULV3_RFR, ZWave, 1-Wire, ESPEasy, Signalduino

hexenmeister

Gute Idee mit mkdir mit -p !
Danke, habe Commandref entsprechend geändert.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Edi77

Ich hätte da mal noch eine Frage

Irgendwo habe ich hier mal gelesen das unter ./contrib/init-scripts/fhem.service existieren würde, was bei mir nicht so ist.
Dann habe ich mal geschaut wo überall die fhem.service auf meinem liegt


root@ubuntu-FHEM:/# find -name fhem.service
./run/systemd/generator.late/graphical.target.wants/fhem.service
./run/systemd/generator.late/multi-user.target.wants/fhem.service
./run/systemd/generator.late/fhem.service
./var/lib/lxcfs/cgroup/pids/system.slice/fhem.service
./var/lib/lxcfs/cgroup/blkio/system.slice/fhem.service
./var/lib/lxcfs/cgroup/devices/system.slice/fhem.service
./var/lib/lxcfs/cgroup/cpu,cpuacct/system.slice/fhem.service
./var/lib/lxcfs/cgroup/memory/system.slice/fhem.service
./var/lib/lxcfs/cgroup/name=systemd/system.slice/fhem.service
./sys/fs/cgroup/pids/system.slice/fhem.service
./sys/fs/cgroup/blkio/system.slice/fhem.service
./sys/fs/cgroup/devices/system.slice/fhem.service
./sys/fs/cgroup/cpu,cpuacct/system.slice/fhem.service
./sys/fs/cgroup/memory/system.slice/fhem.service
./sys/fs/cgroup/systemd/system.slice/fhem.service
./sys/fs/cgroup/unified/system.slice/fhem.service


Daher die Frage, ist "/etc/systemd/system/fhem.service" das immer noch der richtige Ort?

Master FHEM 6 als VM auf ESX Ubuntu 20.04 LTS mit MAXCube/MAX!/FS20|TabletUI|Flightradar|Tasmota|TTN Lora|CCU3 HomematicIP|RPi mit GammaScout|MQTT EasyESP 8266|LuftdatenInfo|deCONZ HUEDev|probemon|Siemens Logo|P4D|3D PRINTER RAISE3D

hexenmeister

Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

carlos

Hallo,
Ich habe mr den Watchdog jetzt auch mal eingerichtet.
Ich kriege jetzt aber gar nicht mit ob und wann der watchdog zugeschlagen hat.
Im log sieht man es schon, aber wenn man das im watchdog device noch sehen könnte wäre cool.
Ist das machbar?
Gruß
Carlos
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

Edi77

Du kannst dir z.B. eine EMail schicken lassen  ;)


define SendMail_fhemstart notify global:INITIALIZED|REREADCFG sleep 30;; {DebianMail('aaaa@bbbbb.com','>>>>> FHEM REBOOT <<<<<','>>>>> FHEM REBOOT <<<<<')}
Master FHEM 6 als VM auf ESX Ubuntu 20.04 LTS mit MAXCube/MAX!/FS20|TabletUI|Flightradar|Tasmota|TTN Lora|CCU3 HomematicIP|RPi mit GammaScout|MQTT EasyESP 8266|LuftdatenInfo|deCONZ HUEDev|probemon|Siemens Logo|P4D|3D PRINTER RAISE3D

hexenmeister

Zitat von: carlos am 06 Dezember 2018, 17:31:12
Ich kriege jetzt aber gar nicht mit ob und wann der watchdog zugeschlagen hat.
Im log sieht man es schon, aber wenn man das im watchdog device noch sehen könnte wäre cool.
Ist das machbar?

Schwierig. Man kann natürlich den Startzeitpunkt protokollieren. Aber den Grund nicht wirklich zuverlässig. Wenn der WD zuschlägt, wird FHEM hart beendet (weil ja eh vermutlich schon hängt). Da kann man schlecht etwas zuverlässig speichern.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Solala0815

Hallo Alexander,
wollte den Watchdog installieren, aber irgend etwas läuft bei mir schief.
Nach der Installation wie im ersten Post oder auf deiner Homepage ist
FHEM nicht mehr erreichbar.
Auszug aus dem Log-File.


2019.01.19 16:46:54 3: deCONZ: websocket: Switching Protocols ok
2019.01.19 16:49:01 1: Watchdog Client: systemd watchdog is not available. Module inactiv.
2019.01.19 16:49:01 2: Watchdog Client: no systemd watchdog available
2019.01.19 16:49:33 0: Server shutdown
2019.01.19 16:49:33 1: Shutdown executed
2019.01.19 16:49:34 1: Including fhem.cfg

2019.01.19 16:49:37 3: Druck_Test: I/O device is deCONZ
2019.01.19 16:49:37 1: Watchdog Client: systemd watchdog is not available. Module inactiv.
2019.01.19 16:49:37 1: Including ./log/fhem.save
/var/run/fhem/fhem.pid: No such file or directory
2019.01.19 16:49:38 1: Including fhem.cfg



Das Verzeichnis /var/run/fhem wurde von mir auch schon mal von Hand angelegt. Nach einem Systemstart nicht mehr vorhanden.
Beim ersten Installationsversuch war FHEM 4Min. erreichbar anschliessend 4Min. weg usw.
Bei diesem Versuch wird FHEM ständig rebootet.

Gruß
Thomas

hexenmeister

Verzeichnisse unter /var per Hand anzulegen ist idR sinnlois, da dies wird im RAM-Disk abgebildet. Dafür stehen entsprechende Befehle in dem service-Script.

Laut log läuft dein fhem nicht unter systemd, oder das Modul kann das nicht erkennen.

Interessant ist der Log von systemd. Was wird ausgebenen bei folgendem Befehl
sudo systemctl status fhem.service

Wurde service-script von meiner Webseite genommen? Ist nofork definiert?


Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Solala0815

Hallo Alexander,
war ich mal wieder zu schnell (was bei mir selten vorkommt ;D) und habe das Backup-Image eingespielt.
Kein Problem machen wir es nochmals von Vorne.
Ohne Installation von watchdog.

sudo systemctl status fhem.service

● fhem.service - FHEM Home Automation
   Loaded: loaded (/etc/systemd/system/fhem.service; enabled; vendor preset: ena
   Active: active (running) since Sun 2019-01-06 14:04:47 CET; 1 weeks 6 days ag
  Process: 630 ExecStart=/usr/bin/perl fhem.pl fhem.cfg (code=exited, status=0/S
Main PID: 700 (perl)
   CGroup: /system.slice/fhem.service
           └─700 /usr/bin/perl fhem.pl fhem.cfg

Jan 06 14:04:45 Raspberry-Monitor systemd[1]: Starting FHEM Home Automation...
Jan 06 14:04:47 Raspberry-Monitor systemd[1]: Started FHEM Home Automation.


nun ersetzeich die vorhandene /etc/systemd/system/fhem.service

# $Id: fhem.service 16001 2018-01-26 11:54:41Z betateilchen $

[Unit]
Description=FHEM Home Automation
Wants=network.target
After=network.target

[Service]
Type=forking
User=fhem
Group=dialout
WorkingDirectory=/opt/fhem
ExecStart=/usr/bin/perl fhem.pl fhem.cfg
#ExecStart=/usr/bin/perl fhem.pl configDB
Restart=always

[Install]
WantedBy=multi-user.target

durch die im ersten Post.
Führe  "sudo systemctl daemon-reload".
Dieses mal kommt nach ausführen von "sudo systemctl start fhem.service" eine Fehlermeldung (beim letzten Versuch nicht aufgefallen).

Job for fhem.service failed because a timeout was exceeded.
See "systemctl status fhem.service" and "journalctl -xe" for details.


"status fhem.service"

sudo systemctl status fhem.service
● fhem.service - FHEM Home Automation
   Loaded: loaded (/etc/systemd/system/fhem.service; enabled; vendor preset: enabled)
   Active: activating (start) since Sat 2019-01-19 19:55:03 CET; 1min 42s ago
  Process: 31815 ExecStart=/usr/bin/perl fhem.pl fhem.cfg (code=exited, status=0/SUCCESS)
  Process: 31812 ExecStartPre=/bin/chown -R fhem:dialout /var/run/fhem (code=exited, status=0/SUCCESS)
  Process: 31808 ExecStartPre=/bin/mkdir /var/run/fhem (code=exited, status=1/FAILURE)
Main PID: 700 (code=killed, signal=ABRT)
   CGroup: /system.slice/fhem.service
           └─31816 /usr/bin/perl fhem.pl fhem.cfg

Jan 19 19:55:03 Raspberry-Monitor systemd[1]: Stopped FHEM Home Automation.
Jan 19 19:55:03 Raspberry-Monitor systemd[1]: Starting FHEM Home Automation...
Jan 19 19:55:04 Raspberry-Monitor systemd[1]: fhem.service: PID file /var/run/fhem/fhem.pid not readable (yet?) after start: No such file or directory


und ein "sudo journalctl -xe" bringt mir diese Meldungen.


-- The result is failed.
Jan 19 19:55:00 Raspberry-Monitor systemd[1]: fhem.service: Unit entered failed state.
Jan 19 19:55:00 Raspberry-Monitor systemd[1]: fhem.service: Failed with result 'timeout'.
Jan 19 19:55:03 Raspberry-Monitor systemd[1]: fhem.service: Service hold-off time over, scheduling restart.
Jan 19 19:55:03 Raspberry-Monitor systemd[1]: Stopped FHEM Home Automation.
-- Subject: Unit fhem.service has finished shutting down
-- Defined-By: systemd
-- Support: https://www.debian.org/support
--
-- Unit fhem.service has finished shutting down.
Jan 19 19:55:03 Raspberry-Monitor systemd[1]: Starting FHEM Home Automation...
-- Subject: Unit fhem.service has begun start-up
-- Defined-By: systemd
-- Support: https://www.debian.org/support
--
-- Unit fhem.service has begun starting up.
Jan 19 19:55:03 Raspberry-Monitor mkdir[31808]: /bin/mkdir: das Verzeichnis ,,/var/run/fhem" kann nicht angelegt werden: Die Datei existiert bereits
Jan 19 19:55:04 Raspberry-Monitor systemd[1]: fhem.service: PID file /var/run/fhem/fhem.pid not readable (yet?) after start: No such file or directory
Jan 19 19:55:18 Raspberry-Monitor deCONZ-WIFI.sh[299]: Device "wlan0" does not exist.
Jan 19 19:55:19 Raspberry-Monitor sudo[31793]: pam_unix(sudo:session): session closed for user root
Jan 19 19:55:49 Raspberry-Monitor deCONZ-WIFI.sh[299]: Device "wlan0" does not exist.
Jan 19 19:56:19 Raspberry-Monitor sudo[32231]:       pi : TTY=pts/0 ; PWD=/home/pi ; USER=root ; COMMAND=/bin/systemctl status fhem.service
Jan 19 19:56:19 Raspberry-Monitor sudo[32231]: pam_unix(sudo:session): session opened for user root by pi(uid=0)
Jan 19 19:56:20 Raspberry-Monitor deCONZ-WIFI.sh[299]: Device "wlan0" does not exist.
Jan 19 19:56:43 Raspberry-Monitor sudo[32231]: pam_unix(sudo:session): session closed for user root
Jan 19 19:56:46 Raspberry-Monitor sudo[32373]:       pi : TTY=pts/0 ; PWD=/home/pi ; USER=root ; COMMAND=/bin/systemctl status fhem.service
Jan 19 19:56:46 Raspberry-Monitor sudo[32373]: pam_unix(sudo:session): session opened for user root by pi(uid=0)
Jan 19 19:56:46 Raspberry-Monitor sudo[32373]: pam_unix(sudo:session): session closed for user root
Jan 19 19:56:51 Raspberry-Monitor deCONZ-WIFI.sh[299]: Device "wlan0" does not exist.
Jan 19 19:57:21 Raspberry-Monitor deCONZ-WIFI.sh[299]: Device "wlan0" does not exist.
Jan 19 19:57:52 Raspberry-Monitor deCONZ-WIFI.sh[299]: Device "wlan0" does not exist.
Jan 19 19:57:57 Raspberry-Monitor sudo[335]:       pi : TTY=pts/0 ; PWD=/home/pi ; USER=root ; COMMAND=/bin/journalctl -xe
Jan 19 19:57:57 Raspberry-Monitor sudo[335]: pam_unix(sudo:session): session opened for user root by pi(uid=0)
Jan 19 19:58:23 Raspberry-Monitor deCONZ-WIFI.sh[299]: Device "wlan0" does not exist.
Jan 19 19:58:53 Raspberry-Monitor deCONZ-WIFI.sh[299]: Device "wlan0" does not exist.
Jan 19 19:59:03 Raspberry-Monitor systemd[1]: fhem.service: Start operation timed out. Terminating.
Jan 19 19:59:03 Raspberry-Monitor systemd[1]: Failed to start FHEM Home Automation.
-- Subject: Unit fhem.service has failed
-- Defined-By: systemd
-- Support: https://www.debian.org/support
--
-- Unit fhem.service has failed.


Gruß Thomas