Watchdog4IPS

Hallo,

ich teile heute mein Watchdog-Skript, das ich benutze, um zu prüfen ob IPS „lebt“. Das Skript ist sehr einfach zu verwenden und leistet bei mir seit vielen Monaten gute Dienste. Es funktioniert folgendermaßen:

Ein CMD-Skript wird erstellt und als eigener Prozess gestartet. Das CMD-Skript erstellt regelmäßig eine Datei und wartet darauf, dass diese vom IPS-Skript aus umbenannt wird. Bleibt dies aus, so wird zunächst der IPS-Dienst beendet. Nach einer Weile wird der Prozess, falls er noch läuft, abgeschossen. Dann wird versucht, ihn neu zu starten. Das Skript wartet auf ein Lebenszeichen. Stellt sich dieses nicht ein, d.h. der Neustart des IPS-Dienstes schlug fehl, so startet das Skript das ganze System neu.

Alle Aktionen des Watchdog-Skripts werden in der Datei watchdog.log im Log-Ordner protokolliert.

Zum Installieren muss einfach der Quellcode unten in ein leeres Skript kopiert und dieses einmal manuell gestartet werden. Es wird daraufhin eine Variable „Active“ vom Typ Boolean angelegt, über die sich das Watchdog-Skript jederzeit manuell starten bzw. beenden lässt.

Im Shutdown-Skript sollte diese Variable auf false, im Startup-Skript auf true gesetzt werden!

Bitte teilt mir mit, falls es Probleme gibt.

<?

$vid = @IPS_GetVariableIdByName('Active', $_IPS['SELF']);
if($vid === FALSE)
{
   $vid = IPS_CreateVariable(0);
   IPS_SetName($vid, 'Active');
   IPS_SetParent($vid, $_IPS['SELF']);
   
   $eid = IPS_CreateEvent(0);
   IPS_SetEventTrigger($eid, 1, $vid);
   IPS_SetParent($eid, $_IPS['SELF']);
   IPS_SetEventActive($eid, true);
   
	SetValue($vid, false);
}

if($_IPS['SENDER'] == 'Execute')
{
	$hdl = @fopen('watchdog.cmd', 'r');
	if($hdl)
	{
	   echo "watchdog.cmd already exists. Checking content...";
	   
		if(filesize('watchdog.cmd') == 0)
		   $currentFileContent = '';
		else
			$currentFileContent = fread($hdl, filesize('watchdog.cmd'));
			
	   fclose($hdl);
	   
	   if($currentFileContent != scriptFileContent())
	   {
	      echo "Content needs to be updated!\r";
	      
	      $hdl = @fopen('watchdog.cmd', 'w');
	      if($hdl)
	      {
	         fwrite($hdl, scriptFileContent());
	         fclose($hdl);
	         echo "watchdog.cmd file updated successfully!\r";
	      }
	      else echo "Error: Unable to access watchdog.cmd file.\r";
	   }
	   else echo "Content is up to date.\r";
	}
	else
	{
      echo "Creating watchdog.cmd...";

      $hdl = @fopen('watchdog.cmd', 'w');
      if($hdl)
      {
         fwrite($hdl, scriptFileContent());
         fclose($hdl);
         echo "file created successfully!\r";
      }
      else echo "unable to create file!\r";
	}
	
	IPS_SetScriptTimer($_IPS['SELF'], 60);

   $hdl = @fopen('watchdog.kill', 'w');
   if($hdl) fclose($hdl);
}
else if($_IPS['SENDER'] == 'Variable')
{
	if(!$_IPS['VALUE'])
	{
	   $hdl = @fopen('watchdog.kill', 'w');
	   if($hdl) fclose($hdl);
	}
}
else
{
	if(file_exists('alive.check'))
	{
		@rename('alive.check', 'alive.ok');
	}
	else if(file_exists('alive.ok'))
	{
	   @unlink('alive.ok');
	}
	else
	{
	   if(GetValue($vid))
	   {
		   echo "watchdog.cmd not running, starting script file now...\r";
		   IPS_Execute('cmd.exe', '/c c:\IP-Symcon\scripts\watchdog.cmd', false, false);
		}
		else
		{
		   $hdl = @fopen('watchdog.kill', 'w');
		   if($hdl) fclose($hdl);
		}
	}
}

function scriptFileContent()
{
$scriptFileContent = <<<HEREDOC
@echo off
cd C:\IP-Symcon\scripts
if "%1"=="" goto callWithLog
echo %DATE% %TIME% IP-Symcon Watchdog CMD Script started!
if exist watchdog.kill del watchdog.kill>nul
set firstPass=1

:beginCheck
if exist alive.ok del alive.ok>nul
echo %DATE% %TIME% Checking (90 Sec. Timeout)...
echo %DATE% %TIME%>alive.check
ping 1.1.1.1 -n 1 -w 90000>nul
if exist watchdog.kill goto watchdogKill
if exist alive.check goto noResponse
goto aliveOk

:aliveOk
echo %DATE% %TIME% IP-Symcon is responding correctly!
set firstPass=0
goto beginCheck

:noResponse
if "%firstPass%"=="1" goto noWatchdog
if "%firstPass%"=="2" goto restartFailed

echo %DATE% %TIME% Warning: IP-Symcon is not responding. Shutting down Service (300 Sec. Timeout)...
start /b net stop IPSServer>nul
ping 1.1.1.1 -n 1 -w 300000>nul
echo %DATE% %TIME% Killing process (if still running)...
taskkill /F /IM ips.exe>nul
echo %DATE% %TIME% Starting Service (120 Sec. Delay)...
net start IPSServer>nul
ping 1.1.1.1 -n 1 -w 120000>nul
if exist watchdog.kill del watchdog.kill>nul
set firstPass=2
goto beginCheck

:restartFailed
echo %DATE% %TIME% Error: Starting of Service failed. Rebooting.
rem using /f can lead to unstable system state!
rem shutdown /r /t 60 /f>nul
shutdown /r /t 60>nul
goto end

:noWatchdog
echo %DATE% %TIME% Error: IP-Symcon did not respond to the first check.
goto end

:watchdogKill
echo %DATE% %TIME% Kill request received from IP-Symcon!
if exist alive.check del alive.check>nul
if exist alive.ok del alive.ok>nul
if exist watchdog.kill del watchdog.kill>nul
goto end

:callWithLog
call watchdog.cmd log>>..\logs\watchdog.log
goto end

:end
echo %DATE% %TIME% Script execution ended.

HEREDOC;
return $scriptFileContent;
}
?>

Ergänzung: Shutdown-Skript.

Falls noch keines existiert, Skript erstellen und „Kern Instanzen / Event Handler“ als Shudown-Skript wählen.

Im Shutdown-Skript sollte der Watchdog beendet werden:

SetValue(12345 , false); // statt 12345 die ID der Active-Variable einsetzen
$hdl = @fopen('watchdog.kill', 'w');
if($hdl) fclose($hdl);

Hallo Sokkederheld,

was muss geändert werden, wenn IPS nicht im gleichen Verzeichnis liegt, wie bei dir?

Nur das hier aus den CMD-Part?

cd C:\IP-Symcon\scripts

Grüße,
Doc

Mit Sicherheit kann ich das nicht beantworten (kann’s halt nicht testen), aber ich gehe davon aus dass es nur das ist. Es sei denn, es liegt auf einem anderen Laufwerk, dann muss das Laufwerk noch angewählt werden.

Alle übrigen Pfadangaben sind relativ.

Alles klar,

werde ich dann mal testen.

Grüße,
Doc

Hallo sokkederheld,

ich komme hiermit nicht klar.

Im Shutdown-Skript sollte diese Variable auf false, im Startup-Skript auf true gesetzt werden!

Wo finde ich dieses Script um die entsprechenden Einstellungen vornehemn zu können?

Habe es oben ergänzt.

Hallo sokkederheld,

wenn ich das richtig versehe muss ich zwei Scripte anlegen (Shutdown und Startup).

Im Script mit dem Namen Shutdown

[ul]
[li]die Active-Variable mit „false“ eintragen
[/li][li]im Event-Handler dieses Script bei Herunterfahr-Script eintragen
[/li][/ul]

Im Startup-Script

[ul]
[li]die Active-Variable mit „true“ eintragen
[/li][li]im Event-Handler dieses Script bei Start-Script eintragen
[/li][/ul]

Ist das so richtig?

Darf ich mal fragen wie oft bei euch IPS einfach so im Laufenden Betrieb aussteigt?
Ich habe IPS seit 5 Jahren stabil (ich kann mich an keinen Absturz durch IPS selbst erinnern) am Laufen.:slight_smile:

Wenn dann macht mal ein Homematic Aktor oder LAN Adapter Probleme, oder es gibt Trouble wegen anderer Windows Software, aber IPS läuft einfach absolut stabil schon seit V1.

Gruß, Andreas

Dito. Rund 2 Jahre ohne einen IPS-Aussetzer. Kompliment! :loveips:

Dass es trotzdem manchmal Ärger gab lag auch bei mir an Homematic oder einem Windows-Grafiktreiber. Seitdem das behoben ist, hab ich seit Monaten absolute System-Stabilität.

Grüße
galleto

@khge: Ja, so mache ich es bei mir. Wenn man will kann man auch eine weitere Variable anlegen, die z.B. „Watchdog Autostart“ heißt und die bestimmt, ob der Watchdog beim Start automatisch laufen soll oder nicht. Im Startup-Skript setzt man dann die Active-Variable auf diesen Wert.

Es gibt ja Situationen wo ein reiner Software-Watchdog an seine Grenzen kommt. Z.B. ist es bei mir so, dass Windows beim Herunterfahren hängen bleibt, die Ursache ist noch nicht gefunden. Dann kann es vorübergehend besser sein, den Watchdog nicht laufen zu haben.

Zur grundsätzlichen Stabilitätsfrage: Es gibt leider immer wieder Treiber und andere Software, die Instabilitäten hervorrufen. Ziemlich großen Schaden haben bei mir z.B. Bluetooth-Treiber angerichtet, auch die Treiber für den OWL Stromschätzer hatten z.B. ein Speicherleck. Der Grund für einen IPS-Absturz muss also gar nicht unbedingt bei IPS selbst liegen.

Es gibt aber natürlich auch unter bestimmten Voraussetzungen Hänger in IPS, beispielsweise bei Endlosschleifen. Das passiert häufig dann, wenn man eine Variable in zwei Richtungen synchronisiert und sich das ganze gegenseitig immer wieder aufruft. Hatte ich sehr häufig z.B. bei der Zuordnung von Luchten-Dimmerwerten zu Lichtstimmungen und umgekehrt. So kann man sich schnell das ganze System lahm legen und oft tritt das erst auf wenn man nicht da ist und jemand zu hastig zwei Lichtszenen hintereinander aufruft. Dann ist es gut wenn man zumindest ein Watchdogskript hat, das nach wenigen Minuten eingreift und das festgefarhene System neu startet.

Hallo ,

vielen Dank für deine Anmerkungen und Tipps.
Bei mir ist es ähnlich, deshalb habe ich nach einer „Autostart-Lösung“ gesucht bzw. bin immer noch auf der Suche nach einer für mich passenden individuellen Lösung.

Mit ähnlich meine ich das Hängenbleiben von Windows beim Herunterfahren sowie „Zicken“ der USB-Anschlüsse an denen 1-Wire hängt. Oft hilft bzw. ist die schnellste Lösung ein Neustart von IPS. Allerdings hatte ich hier auch schon Situationnen bei denen ich IPS abschießem musste da es sich nicht mehr beenden ließ.

Vielleicht das

Gruß
Bruno

…was aber auch eine reine Softwarelösung ist und demnach nichts gegen „Hängenbleiber“ & co ausrichten kann.

interessant wäre auch noch ein script, das die letzte Laufzeit der Timer prüft, denn so wie es bei mir ist hängt sich alle 1-20 Tage einer der Timer für die E-Mails auf.
Hab leider noch nicht rausgefunden, wie man via IPS die letzte Laufzeit eines Timers ermitteln kann

Vielleicht damit

http://www.ip-symcon.de/service/dokumentation/befehlsreferenz/ereignisverwaltung/ips-getevent/

Als Hardware-Watchdog benutze ich jetzt eine IP-SL32 von E*V. Dort kann man mittels HTTP-Request einen Ausschalt-Timer setzen. Wenn man diesen periodisch aus- und wieder einschaltet, hat man eine Steckdose, die sich bei Ausbleiben der Aufrufe nach Zeitablauf selbsttätig abschaltet.

Das ist natürlich nur die halbe Miete, deswegen mache ich mit einem ohnehin vorhandenen Arduino periodische Einschalt-Requests auf die Steckdosenleiste, so dass sie auch wieder an geht.

Da das allerdings nicht unbedingt eine universell brauchbare Lösung ist, verzichte ich hier mal auf weitere Erläuterungen… :o

Nachtrag: Argh!!! Jetzt stürzt mir doch tatsächlich diese verdammte Steckdosenleiste ab! Braucht man also bald noch Watchdogs für seine Watchdogs? :mad: