DateiWatchdog für den Solar-Logger

Da es auch schon einmal vorgekommen ist, dass der Solar-Logger hängen gebliebn ist und keine LogDateien mehr erstellt hat, hab ich noch ein DateiWatchdogSkript geschrieben, dass eine von Solar-Logger in regelmäsigen Abständen generierte Datei auf Änderungen Überprüft. Sollte sich die Datei nicht mehr ändern, wird ein anderes Skript ausgeführt, dass bei Bedarf den Solar-Logger aus dem Speicher abschießt und ihn anschließend neu Startet.

Der DateiWatchdog ist noch nicht fertig, weil ich die Skripte selbst nicht nutze. Die Skripte die ihr hier findet sind nur ein Teil des Konzeptes.

Damit der Solar-Logger eine LebenszeichenDatei erzeugt, muss man die TXTStatus.ini um eine Section erweitern.

Das DateiWatchdogSkript

#!/bin/sh
#
# Solar-Logger - A Daemon for logging Data from a Solar Plant
# Copyright (C) 2007  Klaus Dotterweich (dr.dotti@gmx.de)
#
# This program is free software; you can redistribute it and/or modify it under the terms of the
# GNU General Public License as published by the Free Software Foundation;
# either version 3 of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program;
# if not, see .
#
# Solar-Logger - Ein Daemon zum loggen der Daten einer Solaranlage
# Copyright (C) 2007  Klaus Dotterweich (dr.dotti@gmx.de)
#
# Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public License,
# wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren,
# entweder gemäß Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren Version.
#
# Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von Nutzen sein wird,
# aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE oder
# der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.
#
# Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem Programm erhalten haben.
# Falls nicht, siehe .
#



Loggen="JA"																		# Um das Loggen zu aktivieren JA sonst NEIN
LogPfad='/root/Solar-Logger-0.3/DebugLog/'										# Pfad der Datei in die geloggt werden soll
LogDateiName='Solar-Logger-Watchdog.log'										# DateiName der LogDatei
WatchdogDatei='/var/www/SolarAnlage/Details/Watchdog.txt'						# Die Watchdog Datei die Überprüft werden soll
StartBefehl='/root/Solar-Logger-0.3/README/DateiWatchdog/Solar-Logger-Start.sh'	# Befehl zum starten des Solar-Loggers							
#StartBefehl=''																	# Befehl zum starten des Solar-Loggers							
WatchdogZeit=5																	# Intervall in Minuten in der der der Watchdog die Watchdog Datei Überprüft
StartZeit=15																	# Zeit in Minuten nachdem der Solar-Logger gestartet werden soll wenn sich die Watchdog Datei nicht mehr geändert hat.



LogDatei=$LogPfad`date '+%d.'`$LogDateiName										# Datei in die geloggt werden soll

#######################
# Startzeit des Skriptes Merken
#######################
ZeitstempelStart=`date '+%s'`



###########################################
# Überprüfe ob der Watchdog schon läuft
###########################################
#if [ -f /var/run/Solar-Logger-Watchdog.pid ]
#then
#	if [ $Loggen == "JA" ]
#	then
#		echo `date '+%d.%m.%y %T'`: Watchdog ist bereits gestartet. >> $LogDatei
#	fi
#	exit
#else
#	echo $$ > /var/run/Solar-Logger-Watchdog.pid
#fi



#####################
# Start des Watchdog loggen
#####################
if [ $Loggen == "JA" ]
then
	echo `date '+%d.%m.%y %T'`: Watchdog gestartet. >> $LogDatei
	echo `date '+%d.%m.%y %T'`: WatchdogZeit is $WatchdogZeit in Minuten >> $LogDatei
	echo `date '+%d.%m.%y %T'`: StartZeit is $StartZeit in Minuten >> $LogDatei
fi



TempWatchdogDatei=''
TempStartZeit=$StartZeit									# Die Zeit zum Starten des Solar-Loggers wieder zurücksetzen

#####################
# Programmschleife
#####################
while [ true ]
do
	LogDatei=$LogPfad`date '+%d.'`$LogDateiName								# Datei in die geloggt werden soll

	#######################
	# Startzeit der Schleifen Merken
	#######################
	ZeitstempelStartSchleife=`date '+%s'`

	#  Überprüfe ob sich die WatchdogDatei geändert hat
	TempAWatchdogDatei=`cat $WatchdogDatei`
	if [ "$TempAWatchdogDatei" = "$TempWatchdogDatei" ]
	then
		# Wenn sie sich nicht geändert hat
		TempStartZeit=`/usr/bin/expr $TempStartZeit - $WatchdogZeit`
		if [ $Loggen == "JA" ]
		then
			echo `date '+%d.%m.%y %T'`: Watchdog Datei ($TempAWatchdogDatei) hat sich nicht geändert. >> $LogDatei
			echo `date '+%d.%m.%y %T'`: Die TempStartZeit beträgt $TempStartZeit. >> $LogDatei
		fi
	else
		# Wenn sich die Watchdogdatei geändert hat
		TempWatchdogDatei=`cat $WatchdogDatei`
		TempStartZeit=$StartZeit									# Die Zeit zum Starten des Solar-Loggers wieder zurücksetzen
		if [ $Loggen == "JA" ]
		then
			echo `date '+%d.%m.%y %T'`: Watchdog Datei ($TempAWatchdogDatei) hat sich geändert. >> $LogDatei
			echo `date '+%d.%m.%y %T'`: Die TempStartZeit beträgt $TempStartZeit. >> $LogDatei
		fi
	fi

	# Überprüfe ob StartZeit abgelaufen ist
	if [ $TempStartZeit -le 0 ]
	then
		echo `date '+%d.%m.%y %T'`: Die TempStartZeit ist abgelaufen. Der Startbefehl wird ausgeführt. >> $LogDatei
		# Wenn StartZeit abgelaufen ist
		# Solar Logger starten
		$StartBefehl
		# 30 Minuten schafen gehen damit der Logger sicher starten kann
		if ([ $Loggen == "DEBUG" ] || [ $Loggen == "JA" ])
		then
			echo `date '+%d.%m.%y %T'`: Watchdog legt sich für `/usr/bin/expr 30 \* 60` Sekunden schlafen. >> $LogDatei
		fi
		sleep `/usr/bin/expr 30 \* 60`
	fi

	#######################
	# Endezeit der Schleifen Merken
	#######################
	ZeitstempelEndeSchleife=`date '+%s'`

	#################################################
	# SchleifenZeit berechnen
	#################################################
	SchleifenZeit=`/usr/bin/expr $ZeitstempelEndeSchleife - $ZeitstempelStartSchleife`
	if [ $Loggen == "JA" ]
	then
		echo `date '+%d.%m.%y %T'`: Die Schleifenzeit beträgt $SchleifenZeit. >> $LogDatei
	fi

	#  Den Watchdog schlafen legen
	if [ $Loggen == "JA" ]
	then
		echo `date '+%d.%m.%y %T'`: Watchdog legt sich für $WatchdogZeit Minuten schlafen. >> $LogDatei
		echo `date '+%d.%m.%y %T'`: Watchdog legt sich für `/usr/bin/expr $WatchdogZeit \* 60` Sekunden schlafen. >> $LogDatei
	fi
	sleep `/usr/bin/expr $WatchdogZeit \* 60`

done
		

Das Startskript

#!/bin/sh
#
# Solar-Logger - A Daemon for logging Data from a Solar Plant
# Copyright (C) 2007  Klaus Dotterweich (dr.dotti@gmx.de)
#
# This program is free software; you can redistribute it and/or modify it under the terms of the
# GNU General Public License as published by the Free Software Foundation;
# either version 3 of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program;
# if not, see .
#
# Solar-Logger - Ein Daemon zum loggen der Daten einer Solaranlage
# Copyright (C) 2007  Klaus Dotterweich (dr.dotti@gmx.de)
#
# Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public License,
# wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren,
# entweder gemäß Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren Version.
#
# Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von Nutzen sein wird,
# aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE oder
# der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.
#
# Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem Programm erhalten haben.
# Falls nicht, siehe .
#

cd /root/Solar-Logger-0.3
./Solar-Logger -d
		

Beispiel TXTStatus.ini

#
# In dieser Datei werden die Grundeinstellungen, zum Ertsellen von TXT Status Dateien gemacht
#



# Solar Logger Lebenszeichen Status Datei
[Status_0]
ErstellungsZeitpunkt=0 * * * *;											# Zeitpunkt Angabe änlich CRON (siehe Hinweise.txt)

DateiName=Watchdog.txt;													# DateiName der Status Datei

# Konfiguration der UND verknüpften ErstellungsBedingungen
BedingungsAnzahl=0;														# Anzahl der Bedingungen

# Konfiguration der Lokalen Speicherplätze
LokalAnzahl=1;															# Anzahl der Lokalen Speicherplätze
1_Verzeichnis=/var/www/SolarAnlage/Details/;							# Lokales Verzeichnis

# Konfiguration des Versandes der Datei per FTP
FTPAnzahl=0;															# Anzahl der FTP Konfigurationen

# Konfiguration des Versandes der Datei per E-Mail
E-MailAnzahl=0;															# Anzahl der E-Mail Konfigurationen



# Konfiguration der Status Datei Zeilen
ZeilenAnzahl=4;															# Anzahl der Zeilen der Status Datei

1_ZeilenFormat=Watchdog Datei für den Solar-Logger;						# Definition einer Zeile
2_ZeilenFormat=-----------------------------------------------------------------;
3_ZeilenFormat=%s %s;
4_ZeilenFormat=-----------------------------------------------------------------;



DPAnzahl=2;																# Anzahl der verwendeten DP

DPAdressAnfang=SolarAnlage;												# Dieser AdressAnfang wird als Anfang für jede DP Adresse verwendet.

1_DPAdresse=Zeitpunkt.Wert;												# Adresse des DP im DP_Proxy (KopplungsName.Objekt.Objekt...)
1_DPType=TextZeit;														# Type der Variable (TextZeit -> 'var StandDatum = "23.10.2007";')
1_DPFormat=%d.%m.%Y;													# Wenn Type TextZeit AusgabeFormat angeben (Angabe im 'strftime()' Format)('man strftime' für Hilfe)

2_DPAdresse=Zeitpunkt.Wert;												# Adresse des DP im DP_Proxy (KopplungsName.Objekt.Objekt...)
2_DPType=TextZeit;														# Type der Variable (TextZeit -> 'var StandUhrzeit = "11:23:45";')
2_DPFormat=%H:%M:%S;													# Wenn Type TextZeit AusgabeFormat angeben (Angabe im 'strftime()' Format)('man strftime' für Hilfe)



# Ende