fhem überwachen (watchdog)

Begonnen von Elektrolurch, 05 Juli 2014, 10:08:26

Vorheriges Thema - Nächstes Thema

kud

Zitat von: AET_FHEM am 23 Juli 2014, 23:20:32
Hallo also ich hab das etwas anderster gelöst, da bei mir schon Monit läuft um ein paar Dateien und Programme zu checken
---> eigentlich ganz einfach
ein dummy in fhem eingerichtet welcher jede 3 minuten in ein Log schreibt, diese Datei lass ich jetzt von Monit überprüfen.......
easy
super Sach!!

Wärst Du so nett und könntest Deine Konfig von Monit sowie Deine FHEM Einträge posten.

Danke. :)

hypnorex

Ich habe eher das Problem, dass sich nicht fhem verabschiedet, sondern ich den ganzen Rechner neu starten muss. Da hilft dieses Skript leider nichts, da es in diesem Fall auch nicht mehr läuft.

hexenmeister

Zitat von: hypnorex am 11 August 2014, 09:22:23
Ich habe eher das Problem, dass sich nicht fhem verabschiedet, sondern ich den ganzen Rechner neu starten muss. Da hilft dieses Skript leider nichts, da es in diesem Fall auch nicht mehr läuft.

Je anch Hardware kann man den Hardware-Watchdog njutzen. Beim Ausbleiben vor regelmäßigen 'Meldungen' wird das Board neugestartet. Suche in Forum, da war eine Anleitung für RPI und BBB. Dürfte weitgehend auch für Cubietruck gelten.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

hexenmeister

So ein Problem hatte ich auch und auch ähnlich gelöst. Ich habe dafür einen Bash-Script erstellt. Läuft bei mir seit vielen Monaten problemlos.

http://s6z.de/cms/index.php/homeautomation/fhem/23-fhem-watchdog

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

AET_FHEM

#19
in der fhem.cfg
############## datei die alle 3 Minuten geschrieben wird alive Erkennung f�r Monit
define Monit_exec at +*00:03:00 set Monit_timer 1
attr Monit_exec group alive
attr Monit_exec room System
define Monit_timer dummy
attr Monit_timer group alive
attr Monit_timer room System
define FileLog_WD_Monit FileLog ./log/Monit_timer.log Monit_timer*
attr FileLog_WD_Monit group alive
attr FileLog_WD_Monit room Log
##### FHEM start
define FHEM_start notify global:INITIALIZED set Monit_timer 2
attr FHEM_start group System
attr FHEM_start room System

_____________________________________________
im ersten abschnitt wird alle drei Minuten set Monit_timer 1 geschrieben
dieses wird geloggt in der datei Monit_timer.log

im zweiten abschnitt wird bei start von fhem erstmal set Monit_timer 2 geschrieben
weil ich ein Problem hatte das natürlich erst nach 3 Minuten nach dem start von fhem das erste mal in die log geschrieben wurde das war sehr oft ein Problem für mein Monit
Monit_timer 2 lass ich deshalb schreiben das man sehen kann aha wurde neu gestartet damit könnte man sich jetzt eine Email oder Push nachricht zukommen lassen.... kann natürlich auch 1 oder start heißen :-)
___________________________________________________
in der monitrc

check file fhem with path /opt/fhem/log/Monit_timer.log
                start program "/etc/init.d/fhem start"
                stop program "/etc/init.d/fhem stop"
                if timestamp > 5 minute then restart

__________________________________
Standard Einstellung von Monit --> set daemon 120
hier wird jede 120 Sekunden die Datei /opt/fhem/log/Monit_timer.log gecheckt ob diese älter als 5 Minuten ist trift dies zu startet fhem neu
--> mit Monit kann man sich noch Informieren lassen wenn der restart nach X maligem versuch scheitert in Monit direkt darunter zB:
if 5 restarts within 5 cycles then alert
alert hierdeine@email.adresse on
with mail-format {subject: Alaaarrm! on $HOST FHEM server is n$

_________________________________________
eigentlich ganz einfach... klappt wunder bar!!

gandy

#20
Hier noch eine Lösung, bei der Monit direkt die FHEM-Verfügbarkeit erkennt, und die ohne FileLog auskommt.

Dazu habe ich in FHEM ein Kommando "knock" definiert, das als Antwort "hello." schreibt:

define cmd_knock cmdalias knock AS { "hello." }


Mit Telnet auf Port 7072 sieht das dann so aus:

$ echo "knock" | netcat localhost 7072
hello.


Ausserdem lasse ich von FHEM die PID-Datei anlegen mit der aktuellen Process-ID:

attr global pidfilename /var/run/fhem.pid


Dazu passend die Datei /etc/monit/conf.d/fhem (getestet mit monit v5.4 auf einem CubieTruck):

check process fhem with pidfile /var/run/fhem.pid
   start program = "/etc/init.d/fhem start"
   stop  program = "/etc/init.d/fhem stop"
   if failed host localhost port 7072 with send "knock\n" expect "hello." timeout 20 seconds then restart
   if 5 restarts with 5 cycles then timeout


Pfade müssen ggfls. angepasst werden und bei Verwendung eines Passworts müssen wohl die send/receive strings entsprechend erweitert werden.

Diese Lösung erkennt
- Änderung der PID (z.B. durch regulären "shutdown restart")
- Prozess mit der PID in /var/run/fhem verschwindet (z.B. durch Absturz des FHEM-Prozesses)
- Blockierter FHEM Prozess, der nicht mehr auf das "knock" antwortet

Allerdings wird FHEM auch nach einem regulären "shutdown" neu gestartet, was bei Wartungsarbeiten störend sein könnte.
Edit: In diesem Fall kann FHEM durch

$ sudo monit stop fhem

gestoppt und nach Beendigung der Wartungsarbeiten mit

$ sudo monit start fhem

wieder gestartet werden. Das verwendete init-Script sollte bei "stop" ein "shutdown" an FHEM absetzen, um den aktuellen Zustand zu speichern.

Beste Grüße,
Andy.
fhem (svn) auf i5-4210U NUC
2x HMLAN, 19x HM-SEC-RHS, 15x HM-LC-Bl1PBU-FM, etc.
ODYS Neron Tablet / Android 4.2
Samsung Galaxy Tab 2 10.1N / Android 4.1.2
Samsung Galaxy Note / Android 6.0.1

Amenophis86

Zitat von: Elektrolurch am 11 Juli 2014, 14:19:29
Hallo,

habe das mit dem watchdog nun so korrigiert, dass es auch bei reread und shutdown restart funktioniert und nicht mehrere Instanzen vom watchdog erzeugt werden:

define fhem_not global:INITIALIZED|REREADCFG {fhem_not();}

und für die 99_myUtils:


sub fhem_not()
{
Wd_exec();
# alte watchdogs vorsichtshalber löschen
my $ret = `ps | grep watchdog.pl`;
my @lines = split("\n",$ret);
my @retval;
foreach my $l (@lines)
{
if($l =~m/.*perl watchdog.pl.*/)
{
my ($wpid) = split(' ',$l);
push(@retval,"killed: ".$l);
$l = `kill -9 $wpid`;
} # if watchdog
} # end foreach
Log(1,join("\n",@retval));
# und neu starten

system("./startwatchdog&");
} # end sub fhem_not
###############################

Damit braucht man nicht die pid des watchdogs in eine eigene Datei schreiben.

Die wd_exec sieht bei mir jetzt so aus. Da bei mir vmtl. aus thermischen Gründen vor einigen Tagen ein CUNO ausgefallen ist (er geht dann von STATE Initialized auf was anderes) frage ich die CULs noch ab.


sub Wd_exec()
{
my $filename = ">./watchdog.log";
my $pid = getpid();
if (open (WATCHDOGFILE,$filename))
{
printf (WATCHDOGFILE "%d\t%d\n%s",time(),$pid,EventZeit());
close WATCHDOGFILE;
}
# falls man die Funktionsüberprüfung der CULs nicht braucht,
# dann bis zum Ende der Prozedur alles löschen
my $cs = $defs{"CUNO_1"}{STATE} ;
if($cs ne 'Initialized')
{
# AktivMon('ALARM',"CUNO_1 status $cs");
Log(1,"CUNO_1 status $cs");
}
$cs = $defs{"CUL_0"}{STATE} ;
if($cs ne 'Initialized')
{
# AktivMon('ALARM',"CUL_0 status $cs");
Log(1,"CUL_0 status $cs");
}
# bis hier löschen
return undef;
} # end sub wd_exec
#########################

Gruß

Elektrolurch


Das Thema ist zwar alt, aber ich muss es nochmal aufgreifen, da ich nicht weiter komme.

Ich habe in meiner 99 Utils die beiden oben zitierten Subs angelegt. Allerdings kann ich das oben genannte Define nicht anlegen, da nicht klar ist auf welches Modul es sich bezieht.

Weiterhin die Frage, ob das im ersten Post genannte At auch noch definiert werden, oder nicht mehr? Durch die verschiedenen Posts ist es leicht unübersichtlich geworden. Kann jemand vielleicht das ganze nochmal in einem Post als Anleitung verfassen?
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Elektrolurch

Sorry
define fhem_not global:INITIALIZED|REREADCFG {fhem_not();}
muss natürlich
define fhem_not notify global:INITIALIZED|REREADCFG {fhem_not();}

heissen.

Elektrolurch
configDB und Windows befreite Zone!

Amenophis86

Damit wäre das erste Problem gelöst. Von meinem Verständnis muss das AT auch noch angelegt werden, weil das ja immer wieder in die Datei schreibt, oder?
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Amenophis86

Zitat von: AET_FHEM am 16 August 2014, 09:42:21
in der fhem.cfg
############## datei die alle 3 Minuten geschrieben wird alive Erkennung f�r Monit
define Monit_exec at +*00:03:00 set Monit_timer 1
attr Monit_exec group alive
attr Monit_exec room System
define Monit_timer dummy
attr Monit_timer group alive
attr Monit_timer room System
define FileLog_WD_Monit FileLog ./log/Monit_timer.log Monit_timer*
attr FileLog_WD_Monit group alive
attr FileLog_WD_Monit room Log
##### FHEM start
define FHEM_start notify global:INITIALIZED set Monit_timer 2
attr FHEM_start group System
attr FHEM_start room System

_____________________________________________
im ersten abschnitt wird alle drei Minuten set Monit_timer 1 geschrieben
dieses wird geloggt in der datei Monit_timer.log

im zweiten abschnitt wird bei start von fhem erstmal set Monit_timer 2 geschrieben
weil ich ein Problem hatte das natürlich erst nach 3 Minuten nach dem start von fhem das erste mal in die log geschrieben wurde das war sehr oft ein Problem für mein Monit
Monit_timer 2 lass ich deshalb schreiben das man sehen kann aha wurde neu gestartet damit könnte man sich jetzt eine Email oder Push nachricht zukommen lassen.... kann natürlich auch 1 oder start heißen :-)
___________________________________________________
in der monitrc

check file fhem with path /opt/fhem/log/Monit_timer.log
                start program "/etc/init.d/fhem start"
                stop program "/etc/init.d/fhem stop"
                if timestamp > 5 minute then restart

__________________________________
Standard Einstellung von Monit --> set daemon 120
hier wird jede 120 Sekunden die Datei /opt/fhem/log/Monit_timer.log gecheckt ob diese älter als 5 Minuten ist trift dies zu startet fhem neu
--> mit Monit kann man sich noch Informieren lassen wenn der restart nach X maligem versuch scheitert in Monit direkt darunter zB:
if 5 restarts within 5 cycles then alert
alert hierdeine@email.adresse on
with mail-format {subject: Alaaarrm! on $HOST FHEM server is n$

_________________________________________
eigentlich ganz einfach... klappt wunder bar!!

ich habe jetzt mal diese Methode genutzt und bin auch sehr zufrieden damit. Leider muss ich sie "noch" mit Logfile nutzen, da irgendwie das erstellen der Pid File (noch) nicht funktioniert. Was ich noch zusätzlich eingebaut habe ist, dass die Logfile Nachts um kurz nach 0 Uhr bis auf 2 Zeilen geleert wird. Die muss ja nicht besonders groß werden und eigentlich sind die alten Einträge auch egal. Habe es wie folgt mit einem at gelöst:


define Monit_Log_leeren at 00:01:00 {system ("sudo tail -n 2 /opt/fhem/log/Monit_timer.log > /opt/fhem/log/Monit_timer_Dummy.log"); system ("sudo cp /opt/fhem/log/Monit_timer_Dummy.log /opt/fhem/log/Monit_timer.log"); system ("sudo rm /opt/fhem/log/Monit_timer_Dummy.log")}


Wichtig mittels chmod noch die Berechtigung der Datei ändern.
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Cybers

Zitat von: Amenophis86 am 19 November 2015, 19:19:27
ich habe jetzt mal diese Methode genutzt und bin auch sehr zufrieden damit. Leider muss ich sie "noch" mit Logfile nutzen, da irgendwie das erstellen der Pid File (noch) nicht funktioniert. Was ich noch zusätzlich eingebaut habe ist, dass die Logfile Nachts um kurz nach 0 Uhr bis auf 2 Zeilen geleert wird. Die muss ja nicht besonders groß werden und eigentlich sind die alten Einträge auch egal. Habe es wie folgt mit einem at gelöst:


define Monit_Log_leeren at 00:01:00 {system ("sudo tail -n 2 /opt/fhem/log/Monit_timer.log > /opt/fhem/log/Monit_timer_Dummy.log"); system ("sudo cp /opt/fhem/log/Monit_timer_Dummy.log /opt/fhem/log/Monit_timer.log"); system ("sudo rm /opt/fhem/log/Monit_timer_Dummy.log")}


Wichtig mittels chmod noch die Berechtigung der Datei ändern.

leider bekomme ich beim anlegen diesen Fehler: Unknown command system, try help.
Sowohl beim Eingeben des ganzen in der Kommandozeile als auch beim direkten Anlegen in der CFG.

Gruß, Sascha
FHEM 6.2 auf Raspberry PI 4 / Smartvisu
Eltako Serie 14: FAM14, FGW14-USB, FSB14, FSR14-4x, FSR14-2x, FDG14, FTS14-EM in Kombination mit Jung F50 24V Tastern
1-Wire Temperatursensoren
aus alter Zeit:
Gott sei Dank nur noch 3 Homematic Jalousie- & Schaltaktoren! Wer sich mit Funk auskennt, legt Kabel

Amenophis86

Interessanterweise bekomme ich das jetzt auch. Im Test hatte es funktioniert. Suche auch gerade nach dem Fehler. Sobald ich ihn gefunden habe melde ich mich. Sry
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Amenophis86


define Monit_Log_leeren at *00:01:00 {system ("sudo tail -n 2 /opt/fhem/log/Monit_timer.log > /opt/fhem/log/Monit_timer_Dummy.log");; system ("sudo cp /opt/fhem/log/Monit_timer_Dummy.log /opt/fhem/log/Monit_timer.log");; system ("sudo rm /opt/fhem/log/Monit_timer_Dummy.log")}


Jetzt kannst du es nochmal versuchen. Problem war, dass beim define zwei ;; gesetzt werden müssen. Ich hatte es aus der Def kopiert, wo nur noch ein ; drin steht. Hoffe es geht jetzt auch bei dir. Bei mir läuft es :)
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

heiko.ne

Hallo,
mit Bezug auf den eigentlichen ursprünglichen Lösungsvorschlag von Elektrolurch möchte ich meine Umsetzung für den Einsatz bei FHEM auf einem RaspberryPi, die nur mit wenigen Anpassungen an das was Elektrolurch genannt hat, im erfolgreichen Einsatz ist, präsentieren:

1. Diese beiden Devices anlegen:

define Watchdog_exec at +*00:10:00 {Wd_exec()}
define fhem_not notify global:INITIALIZED|REREADCFG {fhem_not()}


2. "99_myUtils.pm" um folgendes ergänzen:

sub fhem_not()
{
Wd_exec();
# alte watchdogs vorsichtshalber löschen
my $ret = `ps | grep watchdog.pl`;
my @lines = split("\n",$ret);
my @retval;
foreach my $l (@lines)
{
if($l =~m/.*perl watchdog.pl.*/)
{
my ($wpid) = split(' ',$l);
push(@retval,"killed: ".$l);
$l = `kill -9 $wpid`;
} # if watchdog
} # end foreach
Log(1,join("\n",@retval));
# und neu starten

system("./startwatchdog&");
} # end sub fhem_not

sub Wd_exec()
{
my $filename = ">./watchdog.log";
my $pid = getpid();
if (open (WATCHDOGFILE,$filename))
{
printf (WATCHDOGFILE "%d\t%d\n%s",time(),$pid,TimeNow());
close WATCHDOGFILE;
}
return undef;
} # end sub Wd_exec


3. Im Ordner \opt\fhem die beiden folgenden Dateien anlegen:

A. "startwatchdog"

#!/bin/sh

home=/opt/fhem

cd $home

trap "" SIGHUP
modprobe cdc_acm
modprobe ftdi_sio
sleep 2

ln -sf $home/FHEM/fhemcmd.sh /var/fhemcmd

PATH=$home:$PATH
export PATH

export LD_LIBRARY_PATH=$home/lib
export PERL5LIB=$home/lib/perl5/site_perl/5.12.2/mips-linux:$home/lib/perl5/site_perl/5.12.2:$home/lib/perl5/5.12.2/mips-linux:$home/lib/perl5/5.12.2

perl ./watchdog.pl


B. "watchdog.pl"

#!/usr/bin/perl

use strict;
use warnings;
use Time::HiRes qw(gettimeofday);

# Main Loop
while(1)
{
my $cycle = 600;
sleep 30;
my $restart = 1;
my $filename = "./watchdog.log";
my ($lt,$pid);
$pid = 0;

if (open (WATCHDOGFILE,$filename))
{
while (<WATCHDOGFILE>)
{
chomp ;
($lt,$pid) = split("\t",$_);
my $diff = time() - $lt;
if($diff <= $cycle)
{
$restart = 0;
}
last;

} # while  reading
close WATCHDOGFILE;
}
if($restart)
{
my $ret = `kill -9 $pid` if($pid);
printf("Watchdog: kill hanging fhem pid=%d: %s\n",$pid, $ret);
exec("/etc/init.d/fhem start");
} # restart
sleep ($cycle - 30);
} # while main loop
1;


Hinweis: Man muss daran denken, für beide Skripte das Ausführen für alle Benutzer zuzulassen:
chmod 755 watchdog.pl
chmod 755 startwatchdog


4. Testen

Wenn man ein "shutdown restart" durchführt, sollten nun zwei weitere Prozesse des Benutzers "fhem" vorhanden sein:

- perl ./watchdog.pl
- /bin/sh ./startwatchdog

Würgt man jetzt den eigentlichen Prozess "perl fhem.pl fhem.cfg" ab, dann sollte er nach einiger Zeit wieder durch den Watchdog erscheinen.

5. Dank an Elektrolurch

Vielen Dank an Dich für Arbeit. Nach einigem Probieren konnte ich Deine Lösung für mein System nutzen. Läuft jetzt perfekt.

Gruß
Heiko

Chris_Worms

Zitat von: gandy am 02 Oktober 2014, 12:23:30
Hier noch eine Lösung, bei der Monit direkt die FHEM-Verfügbarkeit erkennt, und die ohne FileLog auskommt.

Dazu habe ich in FHEM ein Kommando "knock" definiert, das als Antwort "hello." schreibt:

define cmd_knock cmdalias knock AS { "hello." }


Mit Telnet auf Port 7072 sieht das dann so aus:

$ echo "knock" | netcat localhost 7072
hello.


Ausserdem lasse ich von FHEM die PID-Datei anlegen mit der aktuellen Process-ID:

attr global pidfilename /var/run/fhem.pid


Dazu passend die Datei /etc/monit/conf.d/fhem (getestet mit monit v5.4 auf einem CubieTruck):

check process fhem with pidfile /var/run/fhem.pid
   start program = "/etc/init.d/fhem start"
   stop  program = "/etc/init.d/fhem stop"
   if failed host localhost port 7072 with send "knock\n" expect "hello." timeout 20 seconds then restart
   if 5 restarts with 5 cycles then timeout


Pfade müssen ggfls. angepasst werden und bei Verwendung eines Passworts müssen wohl die send/receive strings entsprechend erweitert werden.

Diese Lösung erkennt
- Änderung der PID (z.B. durch regulären "shutdown restart")
- Prozess mit der PID in /var/run/fhem verschwindet (z.B. durch Absturz des FHEM-Prozesses)
- Blockierter FHEM Prozess, der nicht mehr auf das "knock" antwortet

Allerdings wird FHEM auch nach einem regulären "shutdown" neu gestartet, was bei Wartungsarbeiten störend sein könnte.
Edit: In diesem Fall kann FHEM durch

$ sudo monit stop fhem

gestoppt und nach Beendigung der Wartungsarbeiten mit

$ sudo monit start fhem

wieder gestartet werden. Das verwendete init-Script sollte bei "stop" ein "shutdown" an FHEM absetzen, um den aktuellen Zustand zu speichern.

Beste Grüße,
Andy.

Alter Thread, ich weiss. Aber danke dafür, so läuft das bei mir! :-)
Raspberry Pi 2/HM-CFG-LAN/HM-ES-PMSw1-PI/HM-LC-Sw1-PL/HM-Sec-MDIR-2/JeeLink V3/LaCrosse Temp/Humidity/Bluetooh USB Dongle/PebbleBee Bluetooth Tags

FHEM/MySQL/Apache/SmarVisu