fhem überwachen (watchdog)

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

Vorheriges Thema - Nächstes Thema

Elektrolurch

Hallo zusammen,

wer hatte das nicht schon mal, das genau im Urlaub oder wenn sonst niemand zu Hause war, fhem "hängenblieb" oder sich sogar ganz beendete.
Da ich in den letzten Wochen mit einem sporadisch auftretendem Fehler zu kämpfen hatte, habe ich einige "Sicherungsmaßnahmen" implementiert:

1. Damit keine wesentlichen Daten verloren gehen, werden die state/readings regelmäßig automatisch gesichert.
2. Nach dem Start von fhem startet dieses wiederum ein kleines perl-Skript, welches die "Funktionsfähigkeit von fhem überwacht.
fhem schreibt über einen timer (at) regelmäßig (alle 10 Minuten) einen Zeitstempel und seine Prozeß-ID (pid) in eine Datei watchdog.log im fhem-Verzeichnis.
Das perl-Skript watchdog.pl liest nun unabhängig von fhem alle 10 Minuten diese Datei ein. Ist der Zeitstempel älter als 10 Minuten, so scheint fhem zu hängen oder ist abgestürzt.
der watchdog startet fhem dann neu und beendet sich selber, da ja durch den Start von fhem der watchdog initialisiert wird.

1. regelmäßiges Sichern:

define fhem_save_at +*02:22:22 {fhem('save');
return undef; }

Wenn man das direkt in die fhem.cfg schreibt, sind die ";" natürlich zu verdoppeln.
Im Original habe ich noch mehr in den {} -  Klammern stehen, man kann natürlich auf die Perl-Klammern verzichten und direkt den "save - Befehl hinter die Zeitangabe stellen.
define fhem_save_at +*02:22:22 save

2. Regelmäßiges Schreiben des Zeitstempels von fhem aus:

define Watchdog_exec at +*00:10:00 {Wd_exec();}
3. Beim Starten von fehm wird dieses notify ausgeführt. Hier kann man natürlich noch mehr tun. Ich gebe z.B. über einen FS20Sig2 einen Startsound aus und lasse mir eine Mail schicken.
Hier wird nur einmal die Zeitstemple-Datei geschrieben und über "system-call" das  Startskript für den watchdog gestartet.

define fhem_notify notify global:INITIALIZED|REREADCFG {
Wd_exec();
system("./startwatchdog&");
}
Und das muss in die 99_myUtils oder in eine andere 99_myUtils...pm - Datei (Alles was 99_myUtils<und noch irgendwas>.pm heißt, wird von fhem automatisch eingelesen).

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;
}
return undef;
} # end sub wd_exec
########################
In die zweite Zeile der Datei wird die Zeit noch einmal in lesbarer Form mit EventZeit()) ausgegeben.
Ist eine von mir erstellte Funktion, wobei die Reihenfolge hh:mm:ss dd.mm.yy ist. Hat man eine solche sub nicht, kann man die Ausgabe auch weglassen (das lezte  %s in der Formatangabe streichen, und EventZeit() weglassen) oder durch TimeNow() ersetzen.


Und das ist die Datei watchdog.pl, die ins fhem-Verzeichnis gehört:
#!/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("./startfhem&");
} # restart
sleep ($cycle - 30);
} # while main loop
1;

Ddatei: startwatchdog (im fhem-Verzeichnis)
#!/bin/sh

home=/var/InternerSpeicher/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

Test:
Hat man alles eingerichtet, so kann man wie folgt testen:
1. Mit telnet sich anmelden.
2. Ins fhem - Verzeichnis wechseln.
3. ps | grep fhem
zeigt die ProzessID (pid) von ./startfhem an.
Wurde fhem noch nicht neu gestartet, so sollte der watchdog natürlich auch noch nicht laufen.
prüfen mit:
ps | grep watchdog
Außer dem Linux - watchdog sollte da noch nichts anderes sein.
Nun kann man mit
kill -9 <pid> (pid ist die Prozess-ID, die wir oben ermittelt haben), fhem beenden.
Nun gibt man
./startwatchdog
in die shell ein.
Hat man keine Tippfehler gemacht, so läuft nun der watchdog für 30 Sekunden und sollte dann prüfen, ob
a) die watchdog.log - Datei von fhem überhaupt schon geschrieben wurde. Wenn nicht, wird dhem nun gestartet
b) Wie alt der Zeitstempel in der Datei ist. Ist dieser älter als 10 Minuten, so wird dann fhem neu gestartet.

Also, entweder kommt der shell-Prompt bereits wieder nach 30 Sekunden oder nach ca. 10 Minuten.

Soweit der Test.
Ansonsten solte das ganze automatisch funktionieren.
Getestet auf einer FB7390, unter Windows dürfte das allerdings so nicht funktionieren.

Man kann auch fhem einfach neu starten (shutdown restart).
Dann sollte in der Datei watchdog.log der aktuelle Zeitstempel stehen und mit
ps | grep watchdog
sollte man das perl-Skript watchdog.pl als laufenden Prozess angezeigt bekommen.


Gruß

Elektrolurch

configDB und Windows befreite Zone!

Groby

#1
Hallo Elektrolurch,

super Tool! Das habe ich schon ewig gesucht!

Ich hatte nach einen fhem shutdown restart den watchdog bzw. das startscript als Prozess doppelt vorhanden. Deshalb habe ich mit meinen bescheidenen perl Kenntnissen Dein Script erweitert, um den alten watchdog Process zu löschen. Folgender Block wurde vor main eingefügt die nachfolgenden my Definitionen entsprechend angepasst:

use POSIX;
my ($lt,$pid);
my $filename = "./watchdog.pid";
if (open (WATCHDOGFILE,$filename))
{
while (<WATCHDOGFILE>)
{
chomp ;
($lt,$pid) = split("\t",$_);
my $ret = `kill -9 $pid` if($pid);
printf("Watchdog: kill previous watchdog pid=%d: %s\n",$pid, $ret);
last;
} # while  reading
close WATCHDOGFILE;
}

$filename = ">./watchdog.pid";
$pid = getpid();
if (open (WATCHDOGFILE,$filename))
{
printf (WATCHDOGFILE "%d\t%d",time(),$pid);# EventZeit()
close WATCHDOGFILE;
}

Beim Start von watchdog.pl wird die $PID in das File watchdog.pid geschrieben, um sie beim erneuten watchdog restart mit kill entfernen zu können. Zusätzlich habe ich noch folgendes global:SHUTDOWN notify hinzugefügt um die watchdog.log Datei beim shutdown zu leeren:

define fhem_shutdown notify global:SHUTDOWN "> ./watchdog.log"

So startet fhem nach einem shutdown / Fritz reboot sofort nach 30 Sekunden.

Ich denke jetzt läuft es einigermassen rund.

Danke für den Lösungsansatz! Die upgedatete watchdog.pl íst im Anhang.

MfGroby

Elektrolurch

Hallo,

eigentlich dürfte der watchdog-Prozess nicht doppelt vorhanden sein, denn ind der watchdog.pl wird ja fhem mit:

exec('./startfhem&');

gestartet.
exec() beendet den gleichen Prozess und startet einen anderen.
Wenn dann fhem wieder startet, startet es auch watchdog.pl über das Skript ./startwatchdog.
Ich habe jetzt alle möglichen Varianten durchgespielt, wenn man in fhem shutdown eingibt, dann dauert es max. 10 Minuten und fhem ist wieder da.
Der watchdog hat sich durch das exec beendet und wird wieder über das notify in fhem neu gestartet (andere pid für den watchdog).

Gruß

Elektrolurch
configDB und Windows befreite Zone!

Groby

Guten Morgen,

Gute Frage. Du hast Recht der watchdog läuft tadellos. Entweder nach 30 sek oder spätestens nach 10 min. ist fhem wieder da. Aber wenn ich mit dem original Script ein shutdown restart oder rereadcfg mache, kommt folgendes dabei heraus:

# ps | grep watchdog
    4 root         0 SW<  [watchdog/0]
2190 root      1280 S    {startwatchdog} /bin/sh ./startwatchdog
2195 root      4844 S    perl watchdog.pl
2197 root      1280 S    {startwatchdog} /bin/sh ./startwatchdog
2202 root      4844 S    perl watchdog.pl
2206 root      1280 S    {startwatchdog} /bin/sh ./startwatchdog
2213 root      4844 S    perl watchdog.pl
2217 root      1280 S    {startwatchdog} /bin/sh ./startwatchdog
2222 root      4844 S    perl watchdog.pl

Das Ganze nach 3 mal rereadcfg trotz ./startwatchdog& und ./startfhem&. Frag mich warum, aber egal denn jetzt geht es ja...

Gruss, Groby

Elektrolurch

Hallo,

ok, jetzt verstehe ich: über "shutdown restart" wird natürlich ein neuer watchdog gestartet ohne das der alte watchdog sich vorher beendet hat.
Der beendet sich ja nur, wenn er selbst fhem startet.
An den Fall hatte ich nicht gedacht.
Man könnte alternativ zum Starten des watchdogs über fhem natürlich auch das ./startfhem - Skript um die Zeile
perl ./startwatchdog.pl&
ergänzen oder in fhem Abfragen, ob ein watchdog schon läuft.

Gruß


Elektrolurch
configDB und Windows befreite Zone!

tagedieb

Hallo zusammen

ich finde dieses Projekt sehr interessant, zumal auch ich schon mehrmals erlebt habe, das mein FHEM nicht erreichbar war
da ich im Bereich Unix jedoch immer noch zur Kategorie "Dummi" gehöre, möchte ich folgende Dinge noch einmal nachfragen:
Beziehen sich diese Pfadehome=/var/InternerSpeicher/fhem
ln -sf $home/FHEM/fhemcmd.sh /var/fhemcmd
auf das Verzeichnis der FB? und ich muss sie beim Cubietruck ändern?
oder könnte ich alles 1:1 übernehmen?

Für Eure helfenden Antworten, schon einmal vielen Dank im voraus

gruss tagedieb
FHEM 5.6 auf Cubitruck
CUL und Cul 868 und 2 HM LAN an Zbox
Remoteserver auf 2.Zboxi
HM-CC-RT-DN,HM-LC-Bl1PBU-FM,HM-LC-SW1-FM,HM-LC-SW4-PCB,HM-LC-Sw1PBU-FM,HM-PB-2-WM55,HM-PB-6-WM55,HM-SCI-3-FM,HM-SEC-RHS,HM-SEC-SC,HM-SEC-SC-2,HM-SEC-TIS,HM-WDS10-TH-O u.viele mehr
diverse IT Empfänger und LW3

Elektrolurch

Hallo Tagedieb,

in meiner ursprünglichen Version habe ich keine absoluten Pfade verwendet. Ich adressiere das Verzeichnis aus dem fhem und der watchdog gestartet wird, mit "./".
Das Skript "startwatchdog" ist eins zu eins das gleiche Skript wie startfhem, nur die letzte Zeile ist ausgetauscht.Du kannst also mit
cp ./startfhem ./startwatchdog
Dir das Skript kopieren und dann die Zeile mit dem perl-Aufruf abändern.
perl ./watchdog.pl

Dann müsste es funktionieren.

Gruß

Elektrolurch
configDB und Windows befreite Zone!

tagedieb

Hallo Elektrolurch

Dankeschön, es funktioniert prima

Gruss tagedieb
FHEM 5.6 auf Cubitruck
CUL und Cul 868 und 2 HM LAN an Zbox
Remoteserver auf 2.Zboxi
HM-CC-RT-DN,HM-LC-Bl1PBU-FM,HM-LC-SW1-FM,HM-LC-SW4-PCB,HM-LC-Sw1PBU-FM,HM-PB-2-WM55,HM-PB-6-WM55,HM-SCI-3-FM,HM-SEC-RHS,HM-SEC-SC,HM-SEC-SC-2,HM-SEC-TIS,HM-WDS10-TH-O u.viele mehr
diverse IT Empfänger und LW3

willybauss

klingt super! Ich hatte bislang mit einem Shell Script geprüft, ob der fhem Prozess läuft und ggf. gestartet:

#!/bin/sh

# command line to be executed
EXECUTE="/etc/init.d/fhem start"


# check if running
if (  /etc/init.d/fhem status | grep not )
then
echo "$NAME NOT running! Restarting..."
/etc/init.d/fhem start &
fi

exit 0



In der crontab steht dann

# m  h  dom mon dow   command
0  *  *   *   *     /opt/fhem/CheckIfRunsAndRestart


Das funktioniert auch soweit, nur einen hängenden (aber vorhandenen) fhem Prozess findet das Script natürlich nicht. Ich werde deshalb Elektrolurch's Lösung zusätzlich einbauen.
FHEM auf Raspberry Pi B und 2B; THZ (THZ-303SOL), CUL_HM, TCM-EnOcean, SamsungTV, JSONMETER, SYSMON, OBIS, STATISTICS

willybauss

Ich sehe beim durchlesen der Beiträge, dass es doch im Lauf der Diskussion noch Verbesserungen gab. Wäre es zu viel verlangt, um die finalen Dateien zu bitten, z.B. als Anhang zum Beitrag?  :)
FHEM auf Raspberry Pi B und 2B; THZ (THZ-303SOL), CUL_HM, TCM-EnOcean, SamsungTV, JSONMETER, SYSMON, OBIS, STATISTICS

Elektrolurch

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

configDB und Windows befreite Zone!

raspklaus

Hallo,

wäre wirklich nett wenn die finalen Versionen als Download angehängt werden würden.


AET_FHEM

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!!

P.A.Trick

Ein "apt-cache search monit" bringt keine Treffer, dass ist dann auch nicht einfach :-)
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

AET_FHEM

Ein "apt-get install monit" bringt abhilfe
auf jeden fall hier auf meinem Rasberry .....

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

igami

Zitat von: heiko.ne am 10 März 2016, 09:04:45
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:
[...]
Vielen Dank an Dich für Arbeit. Nach einigem Probieren konnte ich Deine Lösung für mein System nutzen. Läuft jetzt perfekt.

Habe das eben auch bei mir so umgestzt, da mein FHEM nach einem Neustart aus der Ferne nicht wieder auf die Beine kam.
Vielen Dank euch.

Grüße
igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Amenophis86

#31
Zitat von: gandy am 02 Oktober 2014, 12:23:30
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


Ich habe eine Frage hierzu. Habe es jetzt auch so ähnlich umgesetzt. Ich hätte gerne noch, dass Monit mich vorher informieren soll. Einmal soll es mich informieren, wenn der Prozess neugestartet wird und einmal, wenn es hängt und vermutlich gleich neu gestartet wird. Habe mir das so vorgestellt:
check process fhem with pidfile /var/run/fhem/fhem.pid
   if start exec /opt/fhem/monitpush2.sh   <----------- Fantasie Code, da ich keine Ahnung habe, ob es einen solchen Befehl gibt
   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 60 seconds then exec /opt/fhem/monitpush.sh
   if failed host localhost port 7072 with send "knock\n" expect "hello." timeout 120 seconds then restart
   if 5 restarts with 5 cycles then timeout


Gibt es einen Code, der dem oben entspricht? Die zweite Variante mit monitpush.sh nach 60 Sekunden müsste klappen, aber gibt es auch etwas für die erst Variante??
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...

HansDampfHH

#32
edit: Erledigt. Habe das nun auch mit monit umgesetzt !

Hallo, ich wollte auch gerade die Umsetzung für das Überwachen des FHEM Prozesses vornehmen.
Vielleicht hat jemand einen Hinweis für nachfolgende Fehlermeldung in meinem Log nach 'shutdown restart':


fhem_not return value: -1
trap: SIGHUP: bad trap
modprobe: ERROR: could not insert 'cdc_acm': Operation not permitted
ln: das Entfernen von ,,/var/fhemcmd" ist nicht möglich: Keine Berechtigung


Bei /var/fhemcmd vielleicht noch die Berechtigung auf fhem:dialout setzen?

Wäre für einen Hinweis dankbar.
FHEM Docker, CUL868, Zigbee, CCU2, Jeelink

ChrisW

#33
Zitat von: heiko.ne am 10 März 2016, 09:04:45
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

Bekomme das hier im Log:
sh: 1: ./startwatchdog: not found


Hab es auch mal angepasst bzw die Dateien wo anders hin kopiert. habe immer das selbe im Log :(
Raspberry PI3 mit allem möglichen.

Elektrolurch

Hallo,

mittlerweile habe ich das auch auf monit umgestellt.
Allerdings sind 60 s recht knapp. Da kann es schon passieren, dass die USB-Ports noch belegt sind und dann die CULs auf disconnect stehen. Daher hat sich in der Praxis 120 s bewährt.

Elektrolurch
configDB und Windows befreite Zone!

Invers

#35
Aus gegebenem Anlass versuche ich auch gerade den Watchdog einzurichten.
Ich bekomme nach dem Neustart von fhem folgende Meldung im log:

2016.11.16 00:52:55 3: fhem_not return value: -1
trap: SIGHUP: bad trap
modprobe: ERROR: could not insert 'ftdi_sio': Operation not permitted
ln: failed to create symbolic link '/var/fhemcmd': Permission denied


Über Putty erhalte ich folgende Meldung:

pi@raspberrypi:/opt/fhem $ ./startwatchdog
trap: SIGHUP: bad trap
modprobe: ERROR: could not insert 'ftdi_sio': Operation not permitted
ln: failed to create symbolic link '/var/fhemcmd': Permission denied



Mit sudo erhalte ich die Meldung
pi@raspberrypi:/opt/fhem $ sudo ./startwatchdog
trap: SIGHUP: bad trap


Der Prompt kommt aber nicht zurück, erst wenn ich mit STRG+C unterbreche.


Die Dateien startwatchdog und watchdog.pl habe ich mit 755 und fhem:dialout angepasst.

Hat wer ne Idee?


EDIT:

Hat sich erst einmal erledigt. Ich habe die Lösung von Betateilchen installiert, klappte auf Anhieb. Danke dafür.
Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

doesel

ZitatHat sich erst einmal erledigt. Ich habe die Lösung von Betateilchen installiert, klappte auf Anhieb. Danke dafür.
Wo find ich denn die?
Doesel
(FHEM auf Cubietruck mit Igor-Image, 64GB SSD), seit März 19 FHEM auf NUC im Proxmox-Container, 240GB SSD, div. Homematic, Max Fensterkontakte, Onewire über Firmata und FHEM2FHEM auf Raspberrys, MySensors, Jeelink-Clone mit GSD-Modul, CUL, SDM220Modbus, Logo!8, WS980WiFi

kumue


Invers

Richtig. Aber unter Jessie gibt es Besonderheiten zu beachten. Ich habe schon um Ergänzung gebeten.
Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

Marlen

Hi Ihr,

hab das auch mal versucht einzurichten...habe auch diesen Fehler:

trap: SIGHUP: bad trap
modprobe: ERROR: could not insert 'cdc_acm': Operation not permitted
ln: failed to create symbolic link '/var/fhemcmd': Permission denied


Kann jemand sagen woran das liegt?

LG
  Malren

micky0867

Das liegt vermutlich an fehlenden Rechten.
Hast du das als root gemacht?

Gesendet von meinem ONEPLUS A3003 mit Tapatalk


Marlen


Marlen

O.k. hab die Dateien nochmal als root angelegt.

Allerdings liefert das:
Test:
Hat man alles eingerichtet, so kann man wie folgt testen:
1. Mit telnet sich anmelden.
2. Ins fhem - Verzeichnis wechseln.
3. ps | grep fhem
zeigt die ProzessID (pid) von ./startfhem an.


Also wenn ich "ps | grep fhem" eingebe passiert nix.

Was mach ich denn jetzt wieder falsch?

LG
  Marlen

micky0867

Probier mal

ps -ef | grep fhem



Gesendet von meinem ONEPLUS A3003 mit Tapatalk


Marlen

Aha...

fhem     32581     1  5 22:26 ?        00:01:37 perl fhem.pl fhem.cfg
fhem     32588     1  0 22:27 ?        00:00:00 /bin/sh ./startwatchdog
fhem     32596 32588  0 22:27 ?        00:00:00 perl ./watchdog.pl


Hab das jetzt die pid mit sudo service fhem status
auch heraus bekommen.

DANKE!

:-* Marlen

hjr

Gestern Nacht um Punkt 00:00 Uhr hat doch tatsächlich fhem (auf einüem RasPi 1) den Dienst quittiert und ich habe mich Dank der vielen Anregungen hier ebenfalls auf eine Watchdog Lösung verlegt.

Dazu habe ich einen fhem "at" und einen cron job definiert, dazu ein kleines Shell Script geschrieben. Der echte Bash Guru würde dafür sicherlich nur einen Einzeiler im Crontab eintragen, aber ich geb mich damit mal zufrieden.

Anbei mein Bash Script.

LG

hjr

betateilchen

#46
Zitat von: hjr am 24 Dezember 2017, 16:32:00
Der echte Bash Guru würde dafür sicherlich nur einen Einzeiler im Crontab eintragen ...

Popcorn... :)

Der echte Bash Guru würde FHEM einfach als service mit gesetzter restart-option aufrufen, der sich selbst überwacht und nach einem Absturz auch wieder automatisch neu startet. Das Betriebssystem kann das selbst nämlich out-of-the-box am allerbesten.

Und man muss nicht jeden Quark in SVN einchecken, vor allem nicht, wenn er so überflüssig ist wie das heute veröffentlichte bash-skript.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

hjr

Gut,

der Thread beschäftigt sich maßgeblich mit dem Use-Case des nicht mehr reagierenden fhem, der Crash-Fall ist ja einfach abgehakt.

Tatsächlich war mir nicht bewusst, das systemd auch einen Watchdog bietet, der diesen etwas komplizierteren "Hänger" Use-Case ebenfalls abdeckt. Vielen Dank für den Tipp.
Leider benutzt fhem noch den sysv init Kompatibilitätsmodus und der systemd-sysv-generator setzt bei mir "Restart=no".

Gibt es Gründe warum wir noch an sysv festhalten?

LG

betateilchen

Zitat von: hjr am 25 Dezember 2017, 01:05:49
Gibt es Gründe warum wir noch an sysv festhalten?

Tun wir gar nicht.

https://forum.fhem.de/index.php/topic,54271.0.html

Eine fhem.service Konfigurationsdatei ist inzwischen in ./contrib/init-scripts vorhanden und benutzt der Einfachheit halber das "alte" Startskript, weil viele Anwender damit besser zurechtkommen als mit der teils kryptischen systemd-Syntax.

Das könnte sich in einer kommenden FHEM Version aber sicher auch irgendwann ändern.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: betateilchen am 25 Dezember 2017, 11:07:09
Das könnte sich in einer kommenden FHEM Version aber sicher auch irgendwann ändern.

Eines hat sich heute schon geändert: Das fhem.service file in ./contrib/init-scripts benutzt ab sofort nicht mehr das alte init.d Startskript.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

hjr

Das klingt sehr gut.

Die ./contrib/init-scripts/fhem.service hilft natürlich wenig wenn sie nicht in der Debian Distro berücksichtigt wird. Habe das komplettiert und die Paket-Trigger aktualisiert. Letzteres mutiert allerdings keine existierende Installation von sysv zu systemd. Das halte ich für gut so und erkenne das als Intention. Die Trigger wurden so von mir getestet und laufen.

Die Wiederstart Funktionalität mit systemd und dem "Restart=always" habe ich ebenfalls getestet (RasPi 1). Es funktioniert für den Crash-Fall (kill -9) perfekt und sehr schnell.

Die hier im Thread so lange diskutierte Watchdog Funktionalität für den Fall eine "Hängers" ist damit allerdings nicht gegeben. Um das mit systemd zu realisieren müsste fhem.pl das sd_notify Protokoll implementieren. -> https://superuser.com/questions/689017/can-systemd-detect-and-kill-hung-processes

LG

betateilchen

Zitat von: hjr am 25 Dezember 2017, 19:26:49
Die ./contrib/init-scripts/fhem.service hilft natürlich wenig wenn sie nicht in der Debian Distro berücksichtigt wird. Habe das komplettiert und die Paket-Trigger aktualisiert.

Du hast inzwischen schon zweimal an fremden Dateien rumgepfuscht.
Lass bitte die Finger von FHEM Dateien, die Dir nicht gehören.

Danke.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

frober

Hallo zusammen,

Ich habe es auch mit monit versucht. Nach der Erstkonfiguration bekomme ich nun einen "Syntax Error ' ' ", immer in der letzten Zeile.
Die monitrc habe ich mit nano bearbeitet und mit Notepad++ auf Win kontrolliert. Ich kann keinen Fehler finden auch die Internetsuche war erfolglos.

Hat jemandmand eine Idee?

Gruß Bernd
Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

ChrisW

also gestern is mein SWAP vollgelaufen = PI3 nurnoch am hängen SSH war quasi auch nicht mehr möglich nach 100 versuchen ein connect aber keine möglichkeit für eine reboot ..
Musste stecker ziehen .. das Problem das System hing so fest da war nichts mehr mit Info an mich ..

So ein Watchdog sollte also irgendwie von "außen" funktionieren .. da ich extern drauf zugreife hab ich nun erstmap uptimerobot einen Web Dienst aktiv. Da bekomme ich dann wenigstens eine Info.
Raspberry PI3 mit allem möglichen.

frober

Zitat von: ChrisW am 25 Juli 2018, 08:01:25
also gestern is mein SWAP vollgelaufen = PI3 nurnoch am hängen SSH war quasi auch nicht mehr möglich nach 100 versuchen ein connect aber keine möglichkeit für eine reboot ..
Musste stecker ziehen .. das Problem das System hing so fest da war nichts mehr mit Info an mich ..

So ein Watchdog sollte also irgendwie von "außen" funktionieren .. da ich extern drauf zugreife hab ich nun erstmap uptimerobot einen Web Dienst aktiv. Da bekomme ich dann wenigstens eine Info.
Probiere es mal mit dem Hardware-Watchdog vom Raspi.


Mein Fehler ist behoben:
Im meiner Erweiterung der Konfiguration​ (email-Versand) war ein Fehler.
Jetzt läuft's....

Gesendet von unterwegs.

Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...