FHEM - Hardware > Server - Linux

FHEM über systemd mit Watchdog und sd_notify

(1/4) > >>

a-p-s:
Hallo zusammen,

aufbauend auf den Diskussionen hier zum Thema systemd hatte ich ein paar Experimente gemacht, um meine FHEM-Installationen etwas stabiler zu machen, ohne die Komplexität hochzuschrauben. Dafür habe ich die systemd-Bordmittel (Watchdog) genutzt.

Hier die resultierende Service Unit:


--- Code: ---[Unit]
Description=FHEM Home Automation
Requires=network.target
After=dhcpcd.service

[Service]
Type=notify
NotifyAccess=all
User=fhem
Group=dialout
WorkingDirectory=/opt/fhem
ExecStart=/usr/bin/perl fhem.pl fhem.cfg
TimeoutStartSec=240
TimeoutStopSec=120
ExecStop=/usr/bin/pkill -U fhem perl
Restart=always
RestartSec=10
WatchdogSec=180
PIDFile=/opt/fhem/log/fhem.pid
 
[Install]
WantedBy=multi-user.target

--- Ende Code ---

Um den Watchdog zu nutzen, muss man aus FHEM regelmäßige Nachrichten über ein UNIX-Socket schicken (sd_notify). Da die Bibliotheken, die ich gefunden habe, ultra-heavy sind für den simplen Task, ist das hier schnell zusammengeschrieben:


--- Code: ---attr global nofork 1

defmod systemd_ready notify global:INITIALIZED { \
use Socket;;;;\
my $name = $ENV{NOTIFY_SOCKET};;;;\
my $sock_addr = sockaddr_un($name);;;;\
socket(my $server, PF_UNIX,SOCK_DGRAM,0);;;;\
connect($server, $sock_addr);;;;\
print $server "READY=1\n";;;;\
close($server);;;; }

defmod systemd_shutdown notify global:SHUTDOWN {\
use Socket;;;;\
my $name = $ENV{NOTIFY_SOCKET};;;;\
my $sock_addr = sockaddr_un($name);;;;\
socket(my $server, PF_UNIX,SOCK_DGRAM,0);;;;\
connect($server, $sock_addr);;;;\
print $server "STOPPING=1\n";;;;\
close($server);;;; }

defmod systemd_watchdog at +*00:01 { \
use Socket;;;;\
my $name = $ENV{NOTIFY_SOCKET};;;;\
my $sock_addr = sockaddr_un($name);;;;\
socket(my $server, PF_UNIX,SOCK_DGRAM,0);;;;\
connect($server, $sock_addr);;;;\
print $server "WATCHDOG=1\n";;;;\
close($server);;;; }

--- Ende Code ---

Das funktioniert bei mir seit einer Weile ganz gut. Mit den Timeouts muss man ein bisschen spielen. Eine meiner Installationen ist da (zeitweise) etwas träge, so dass ich die Timeouts hochgesetzt habe.

Momentan ist das noch ein Hack - da kann man ein Modul draus bauen.

Vielleicht kann trotzdem jemand etwas damit anfangen.

Grüße,
a-p-s

hexenmeister:
ich baue mal kurz ein Modul daraus...

hexenmeister:
So, hier wäre das. Richtig testen konnte ich noch nicht, muss zuerst mein Test-FHEM auf systemd-script umstellen.
Datei in FHEM-Verzeichnis werfen und Device anlegen.

--- Code: ---define watchdog systemd_watchdog
--- Ende Code ---

EDIT: Anhang gelöscht

hexenmeister:
Habe ein Fehler mit dem InternalTimer gefunden (lief nach dem Löschen von Modul, mit aktivierten Watchdog sollte man das Modul eh jedoch besser nicht löschen).

hexenmeister:
Vorerst endgültige Version (nur Commandref geschrieben).
Habe zwischendurch testen können.  Benutze Type=forking mit einer PIDFile. Funktioniert bis jetzt sehr gut. Shutdown klappt (Restart=allways durch Restart=on-failure ersetzt). Nach dem kill -9 wird korrekt neu gestartet.

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln