Initskript für BeagleBoard (Systemzeit)
Linux Initskript
Ausgangssituation
Auf einem BeagleBoard-xM, welches keine Real-Time-Clock (RTC) hat, sorgt eine NTP-Abfrage für die genaue Systemzeit.
Problem
Dies funktioniert auch soweit, lediglich beim Systemstart kommt es zu Problemen.
Dadurch, das zum Start-Zeitpunkt von FHEM die Systemzeit noch nicht richtig gesetzt ist, wird ein Datum im September 2012gewählt (hier ist jetzt aber aktuell Januar 2013). Dadurch legt FHEM beim Start, sofern die Log-Dateien auf die monatliche Version (in diesem Fall sogar bei der Jahres-Einstellung) eingestellt sind, im Log-Verzeichnis für jedes Device eine zusätzliche Log-Datei mit dem falschen Datum (Monat bzw. Jahr) an.
Kurz darauf, sobald durch das Init-Skript per NTP die Systemzeit auf das richtige Datum (incl. Zeit) gesetzt worden ist, schreibt FHEM die neuen Werte in die richtigen Datums-Log-Dateien.
Auswirkungen:
- überflüssige physikalische Log-Dateien
- die Anzeige beim Aufruf der FHEM-Seite Everything wird unnötig aufgebläht und verzögert
- die durch FHEM verursachte Systemlast (load) steigt beim Aufruf von FHEM Everything teils auf über 95 %.
Ursache
FHEM wird (hier) durch die Initskripte vordem Aufruf des NTP-Dienstes gestartet.
Ob dies auch bei Ihnen so ist, können Sie relativ einfach feststellen. Wichtig ist zunächst festzustellen, in welchem runlevelsich ihr System befindet. Dies sollte zwar der Level 3sein, aber wer weiß. Ermitteln Sie also ihren runleveldurch Eingabe des Befehls
# runlevel
Ausgabe hier:
N 3
Nun gehen Sie in das Verzeichnis /etc/init.d(per cd /etc/init.d). Dort sehen Sie bei einem ls -lfolgende Informationen (Ausschnitt):
drwxr-xr-x 2 root root 4096 Okt 29 16:56 rc0.d drwxr-xr-x 2 root root 4096 Okt 29 16:58 rc1.d drwxr-xr-x 2 root root 4096 Jan 21 18:16 rc2.d drwxr-xr-x 2 root root 4096 Jan 31 20:24 rc3.d drwxr-xr-x 2 root root 4096 Sep 7 20:18 rc4.d drwxr-xr-x 2 root root 4096 Jan 21 18:16 rc5.d drwxr-xr-x 2 root root 4096 Okt 29 16:56 rc6.d drwxr-xr-x 2 root root 4096 Okt 29 16:58 rcS.d
Dabei handelt es sich um Initialisierungsverzeichnisse für die verschiedenen runlevel(welcher Dienst soll in welchem level gestartet werden?).
Da ich (wie wahrscheinlich auch Sie) den Runlevel 3 (siehe obige Ausgabe "N 3") habe, wechsle ich in das Verzeichnis rc3.d und mache dort ein ls -l:
lrwxrwxrwx 1 root root 7 Okt 29 16:58 K01cron -> ../cron lrwxrwxrwx 1 root root 7 Okt 29 16:56 K01dbus -> ../dbus lrwxrwxrwx 1 root root 7 Dez 3 19:57 K01fhem -> ../fhem lrwxrwxrwx 1 root root 16 Okt 29 16:56 K01purge-kernels -> ../purge-kernels lrwxrwxrwx 1 root root 9 Okt 29 16:56 K01random -> ../random lrwxrwxrwx 1 root root 6 Dez 3 19:57 K02kbd -> ../kbd lrwxrwxrwx 1 root root 6 Okt 29 16:58 K02ntp -> ../ntp lrwxrwxrwx 1 root root 19 Okt 29 16:58 K03network-remotefs -> ../network-remotefs lrwxrwxrwx 1 root root 9 Okt 29 16:58 K03syslog -> ../syslog lrwxrwxrwx 1 root root 14 Okt 29 16:58 K04earlysyslog -> ../earlysyslog lrwxrwxrwx 1 root root 10 Okt 29 16:58 K04network -> ../network lrwxrwxrwx 1 root root 6 Okt 29 16:57 S01kbd -> ../kbd lrwxrwxrwx 1 root root 7 Okt 29 16:57 S02dbus -> ../dbus lrwxrwxrwx 1 root root 14 Okt 29 16:58 S02earlysyslog -> ../earlysyslog lrwxrwxrwx 1 root root 16 Okt 29 16:57 S02purge-kernels -> ../purge-kernels lrwxrwxrwx 1 root root 9 Okt 29 16:57 S02random -> ../random lrwxrwxrwx 1 root root 7 Jan 31 20:24 S02fhem -> ../fhem lrwxrwxrwx 1 root root 10 Okt 29 16:58 S03network -> ../network lrwxrwxrwx 1 root root 19 Okt 29 16:58 S04network-remotefs -> ../network-remotefs lrwxrwxrwx 1 root root 9 Okt 29 16:58 S04syslog -> ../syslog lrwxrwxrwx 1 root root 6 Okt 29 16:58 S05ntp -> ../ntp lrwxrwxrwx 1 root root 7 Jan 21 18:16 S06cron -> ../cron
Wichtig sind hier die Start-Skripte, also die, die mit einem Sbeginnen (nebenbei: Die Skripte mit einem vorangestellten Kdienen dem Beenden (K für Kill) eines Dienstes). Durch die nachfolgende Zahl wird die Reihenfolge bestimmt, in der die Skripte ausgeführt werden:
... lrwxrwxrwx 1 root root 7 Jan 31 20:24 S02fhem -> ../fhem ... lrwxrwxrwx 1 root root 6 Okt 29 16:58 S05ntp -> ../ntp
Der FHEM-Dienst wird über die Datei S02fhemund NTP über S05ntpgestartet, FHEM in jedem Fall also vordem NTP-Dienst.
Lösung
Mittels eines
# mv S02fhem S99fhem
benennen Sie das Skript (eigentlich nur ein Soft-Link, aber das ist hier unwichtig) jetzt einfach so um, dass es in jedem Fall als letztesgestartet wird (S99).
Ab dem nächsten Systemstart (Stromausfall) sollten dann keine überflüssigen Log-Dateien mehr angelegt werden.