Initskript für BeagleBoard (Systemzeit)

Aus FHEMWiki
Version vom 19. Juni 2018, 14:52 Uhr von Beta-User (Diskussion | Beiträge) (→‎Lösung)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Linux Initskript für BeagleBoard xM

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 vor dem 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 runlevel sich ihr System befindet. Dies sollte zwar der Level 3 sein, 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 -l folgende 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 S beginnen (nebenbei: Die Skripte mit einem vorangestellten K dienen 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 S02fhem und NTP über S05ntp gestartet, FHEM in jedem Fall also vor dem 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 letztes gestartet wird (S99).

Ab dem nächsten Systemstart (Stromausfall) sollten dann keine überflüssigen Log-Dateien mehr angelegt werden.