Initskript für BeagleBoard (Systemzeit): Unterschied zwischen den Versionen
Drhirn (Diskussion | Beiträge) KKeine Bearbeitungszusammenfassung |
K (Beta-User verschob die Seite Linux Initskript nach Initskript für BeagleBoard (Systemzeit): Alter Titel nicht aussagekräftig) |
Version vom 19. Juni 2018, 14:48 Uhr
Todo: Der Titel ist nicht sehr aussagekräftig und sollte geändert werden. |
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 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.