Automatischer FHEM Neustart nach Absturz

Begonnen von Jojo11, 06 Februar 2014, 20:25:18

Vorheriges Thema - Nächstes Thema

Jojo11

Hallo,

nachdem mein Raspberry nun dank neuem Netzteil stabil seine Dinge verrichtet, mach mir der aktive USB-Hub (LOGILINK UA0148) Probleme. Es kommt alle paar Tage vor, dass er sich verschluckt und kurzfristig die Geräte entfernt. Im FHEM logfile erscheint dann sowas:

2014.02.06 17:45:04.439 1: /dev/USB-FHEM1 disconnected, waiting to reappear
2014.02.06 17:45:04.472 1: /dev/USB-FHEM2 disconnected, waiting to reappear
2014.02.06 17:45:05.441 3: Setting JLLaCR baudrate to 57600
2014.02.06 17:45:05.468 1: /dev/USB-FHEM1 reappeared (JLLaCR)
2014.02.06 17:45:06.004 3: Setting TRX_2 baudrate to 38400
2014.02.06 17:45:06.063 1: /dev/USB-FHEM2 reappeared (TRX_2)
2014.02.06 17:47:00.386 3: OWX: Reset failure on bus 1wire
2014.02.06 17:47:07.365 3: OWX: Reset failure on bus 1wire


Angeschlossen am hub sind ein Jeelink, ein RFXtrx und ein LinkUSB 1-wire Adapter. Unmittelbar nach der letzten Meldung (OWX: Reset failure on bus 1wire) verabschiedet sich FHEM. Gut ist, dass der Raspberry weiterläuft. Mit einem invoke-rc.d fhem start lässt sich FHEM wieder starten und alles läuft wieder rund.
Da ich den genauen Fehler noch nicht gefunden habe (habe den LinkUSB im Verdacht), würde ich mir gerne zwischenzeitlich mit einem cronjob behelfen, der alle paar Minuten port 8084 anpingt und bei Nichterreichen mittels "invoke-rc.d fhem start" FHEM neustartet. Super wäre natürlich, wenn ich in einem solchen Fall auch noch per sendEmail benachrichtigt würde. Leider bin ich kein Experte, was Linux-Skripte angeht ???
Kann es sein, dass der 1-wire Adapter FHEM zum Absturz bringt (diese Frage gehört eher in die 1-wire Abteilung)?
Hat jemand hier evtl. schon ein solches Skript am laufen und würde es vielleicht veröffentlichen?
Danke!

schöne Grüße
Jo

Nachtrag: Gerade http://forum.fhem.de/index.php?topic=10064.0 gefunden. Das schaue ich mir mal an.

Wernieman

Du könntest auch gucken, ob der "fhem-prozess" noch da ist.

Im "Bash-Pseudokode":
if  `ps aux | grep [f]em.pl` then
  # Prozess ist da, also nix tuhen
else
  # Fhem start
fi


Nach dem "Port" gucken, könntest Du natürlich über die Konsole
if `echo -en "passwort\nlist\nquit" | nc localhost 7072`
.....


Anstatt telnet, würde auch wget o.ä. gehen .. wie in dem von Dir genannten Thread
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Jojo11

Danke, ich hatte mir zwischenzeitlich schon mit dem status-Teil aus dem Linux-Initskript (http://www.fhemwiki.de/wiki/Linux_Initscript) geholfen. Klappt wunderbar per cron job. Sobald FHEM abstürzt bekomme ich eine email und es wird neu gestartet. Jetzt musss ich nur auf den nächsten Ausfall warten, um auf Fehlersuche gehen zu können  :D

schöne Grüße
Jo

fhainz

Zitat von: Jojo11 am 07 Februar 2014, 17:42:47
Sobald FHEM abstürzt bekomme ich eine email und es wird neu gestartet.

Kannst du mir zeigen wie das bei dir aussieht?

Grüße

Jojo11

Na klar:

cd /opt/fhem
  port=7072
  cnt=`ps -ef | grep "fhem.pl" | grep -v grep | wc -l`
  if [ "$cnt" -eq "0" ] ; then
                echo "FHEM abgestürzt"
invoke-rc.d fhem start
sendEmail -f 'absender@adresse' -t 'empfänger@adresse' -u 'Betreff' -m 'Text' -s 'server' -xu 'user' -xp 'pass' -o tls=no
        else
                echo "FHEM ok"
        fi



Das alles wird in eine ausführbare Datei irgendwo gespeichert und per cronjob alle paar Minuten ausgeführt.

schöne Grüße
Jo

Wernieman

#5
Wobei Du nur guckst, ob Dein fhem-Prozess da" ist. Ob er läuf, wird in deinem Script nicht geprüft.

Edit
die Zeile
cnt=`ps -ef | grep "fhem.pl" | grep -v grep | wc -l`
sollte man eigentlich (normales Unix/Linux) auch wie folgt schreiben können:
cnt=`ps -ef | grep "[f]hem.pl" | wc -l`
Außerdem ist das mit "wc -l", was man durch "grep -c" kürzen könnte, nich ganz optimal, warum verwendest Du nicht den Rückgabecode"?
ps -ef | grep -q [f]hem.pl
cnt=$?

- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Jojo11

Danke für den Hinweis. Leider bin ich kein Experte. Die Abfrage habe ich aus dem Init-Skript (http://www.fhemwiki.de/wiki/Linux_Initscript). Bislang hat es einwandfrei funktioniert, weshalb ich keinen Bedarf sah, das Skript anzupassen.
Deine Variante wäre also

cd /opt/fhem
port=7072
ps -ef | grep -q [f]hem.pl
cnt=$?
if [ "$cnt" -eq "0" ] ; then
  echo "FHEM abgestürzt"
  invoke-rc.d fhem start
  sendEmail -f 'absender@adresse' -t 'empfänger@adresse' -u 'Betreff' -m 'Text' -s 'server' -xu 'user' -xp 'pass' -o tls=no
else
  echo "FHEM ok"
fi

Oder muss ich die if-Abfrage dann auch abändern?

Der Absturz scheint übrigens auf eine kurzzeitig aussetzende USB-Verbindung zurückzuführen sein, die OWX/LinkUSB zum Absturz bringt. Syslog des RPi sagt

hub 1-1:1.0: port 3 disabled by hub (EMI?), re-enabling...

Ich habe jetzt mal das Kabel zum Hub getauscht und hoffe, dass der Fehler nicht mehr auftritt.

schöne Grüße
Jo

Dirk

Falls es noch interessant ist:

Ich benutze zur Überwachung von FHEM und anderen Diensten monit.
http://mmonit.com/monit/

Damit kann z.B. auch der Load des Raspberry Pi, der freie Platz auf der SD-Karte, und viele Sachen mehr gemonitort werden.
Bei bestimmten Ereignissen kann monit auch Emails versenden und wenn z.B. FHEM abgestürtz ist, dieses auch neu starten.

Hier mal eine Ausschnitt aus meiner Config:

check process fhem with pidfile /var/run/fhem.pid
    start program = "/etc/init.d/homeServer start"
    stop program = "/etc/init.d/homeServer stop"
    group server

check filesystem sda2 with path /dev/sda2
    if space usage > 95% for 5 times within 15 cycles then alert
    if inode usage > 900000 then alert


Gruß
Dirk

Wernieman

@Jojo11

Du müstest bei der letzten Variante die Abfrage umdrehen.
$? enthält den Fehlercode des letzten Programmes. Da bei "nichts gefunden" grep als Fehlercode 1 zurückgiebt ..

@Dirk

Monit ist gut zum Prozessüberwachen. Nur "pollt" monit relativ häufig. Ein Check z.B. ob fhem auch per Netzwerk reagiert würde damit ... sehr recourcen Fressen.
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

betateilchen

Warum nicht einfach die ohnehin vorhandenen watchdog Möglichkeiten nutzen, die der Raspi bietet?

Damit kann ich in einer cfg Datei alles angeben, was überwacht werden soll, Netzwerkverfügbarkeit, Speicherplatz, Prozeßliste usw.

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

Dirk

Zitat von: Wernieman am 10 Februar 2014, 08:59:22
Monit ist gut zum Prozessüberwachen. Nur "pollt" monit relativ häufig. Ein Check z.B. ob fhem auch per Netzwerk reagiert würde damit ... sehr recourcen Fressen.
Den Intervall kann man Konfigurieren.
Und ein Check einmal pro Minute fällt ressourcentechnisch im normalen Betrieb nicht auf.
Zumindest beim meinem Raspberry merke ich hier nix.

Zitat von: betateilchen am 10 Februar 2014, 09:15:01
Warum nicht einfach die ohnehin vorhandenen watchdog Möglichkeiten nutzen, die der Raspi bietet?
Du meist aber nicht den Hardware-Watchdog vom Raspberry?
Ich dachte der kann nur den Raspberry selber überwachen und bei bedarf rebooten?

Gruß
Dirk

cpr

Zitat von: betateilchen am 10 Februar 2014, 09:15:01
Warum nicht einfach die ohnehin vorhandenen watchdog Möglichkeiten nutzen, die der Raspi bietet?

Damit kann ich in einer cfg Datei alles angeben, was überwacht werden soll, Netzwerkverfügbarkeit, Speicherplatz, Prozeßliste usw.

War auch spontan mein Gedanke, watchdog acht auf dem Raspberry Pi umso mehr Sinn (als auf manch anderen Linuy-Systemen), weil es sogar Hardwaer-basiert ist:
https://www.google.de/search?q=raspberry+pi+watchdog+hardware&

Hier die Manpage vom Daemon:
http://linux.die.net/man/8/watchdog

Das "Check Binary" und "Repair Binary" können auch Scripte sein!


Zitat von: Dirk am 10 Februar 2014, 09:28:54
Ich dachte der kann nur den Raspberry selber überwachen und bei bedarf rebooten?

Ich war letzte Woche auch überrascht, was der alles kann! ist bislang vollkommen an mir vorbei gegangen.
Schau mal in der manpage mit den Returnstatus des "Check Binary".

Dirk

ZitatSchau mal in der manpage mit den Returnstatus des "Check Binary".
Der Monit checkt bei mir noch ein bissl mehr. Und den kannte ich halt schon von meinem VDR wo mein Haupt-FHEM läuft.
Daher war das die erste Wahl. Auf jeden Fall interessant. Werde ich mir mal merken.


Jojo11

Zitat von: Wernieman am 10 Februar 2014, 08:59:22
@Jojo11

Du müstest bei der letzten Variante die Abfrage umdrehen.
$? enthält den Fehlercode des letzten Programmes. Da bei "nichts gefunden" grep als Fehlercode 1 zurückgiebt ..
[...]

Danke!

schöne Grüße
Jo

vbs

Spricht etwas dagegen, FHEM im Vordergrund in einer while-Schleife einer Shell zu starten? So dass eben durch die Schleife FHEM wieder neu gestartet wird, sobald der laufende Prozess sich beendet? Die Shell sollte dann natürlich ihrerseits im Hintergrund laufen.