GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Datum in Millisekunden auf Openwrt auf Arduino Yun?

Ich verwende OpenWRT auf dem Arduino YUN und versuche, das genaue Datum in Millisekunden (TT/MM/JJJJ h:min:sek:ms) zu erhalten, indem ich die Zeit von einem Zeitserver erhalte.

Leider date +%N gibt nur %N zurück , aber nicht die Nanosekunden. Ich habe +%N gehört ist nicht im OpenWRT-Datum enthalten.

Gibt es also eine Möglichkeit, das Datum (einschließlich Millisekunden) so zu erhalten, wie ich es möchte?

Akzeptierte Antwort:

Auf OpenWRT, date ist busybox , das Einschränkungen hat, aber dies ist streng genommen keine davon. Das zugrunde liegende Problem ist, dass die libc (uClibc) diese GNU strftime-Erweiterung nicht unterstützt. (Allerdings glibc auch nicht, mehr dazu weiter unten.)

Sie sollten lua haben standardmäßig, aber das hilft nicht ohne einige andere nicht standardmäßige Module.

hwclock ruft gettimeofday() auf zum Vergleichen/Einstellen der RTC (Hardware-Uhr), aber es wird keine Auflösung von weniger als einer Sekunde ausgegeben (der Zugriff auf RTCs kann langsam genug sein, dass es sowieso nicht nützlich sein könnte). Ansonsten stellt OpenWRT nur das alte rdate zur Verfügung , die nur eine Auflösung von ganzen Sekunden hat.

Es scheint keine einfache Möglichkeit zu geben, einen genauen Zeitstempel direkt aus /proc zu erhalten , befindet sich der nützlichste Zeitstempel in /proc/timer_list (3. Zeile), das ist die Betriebszeit in Nanosekunden (die Auflösung hängt von der Plattform ab).

Wenn Ihre Busybox mit CONFIG_BUSYBOX_CONFIG_ADJTIMEX gebaut wurde gesetzt, dann sollten Sie in der Lage sein, adjtimex zu verwenden um die Kernel-Uhr zu lesen (beachten Sie jedoch, dass die Busybox-Version beides hat andere Argumente und andere Ausgabe als der Standard adjtimex.

Normale Version, adjtimex -p , letzte Zeile der Ausgabe:

   raw time:  1416419719s 146628us = 1416419719.146628

Busybox-Version, adjtimex (ohne -p !), letzten 3 Zeilen:

   [...]
   time.tv_sec:  1416420386
   time.tv_usec: 732653
   return value: 0 (clock synchronized)

Das von Goldilocks ist eine gute Lösung, vorausgesetzt, Sie haben Ihr OpenWRT-Cross-Build-Setup (dringend empfohlen!).
Ihr coreutils-Datum Die Lösung funktioniert, weil coreutils zwar glibc-fähig ist, aber nicht ausschließlich glibc. Es wird mit einer eigenen eigenständigen Implementierung von strftime geliefert (abgeleitet von glibc) und verwendet dies zum Abschluss (über strftime_case()). ) die zugrunde liegende strftime um verschiedene Erweiterungen zu unterstützen (und greift ansonsten auf die uClibc-Version zurück).

Selbst glibc (bis zur aktuellen Version 2.23) unterstützt %N nicht , die Coreutils strftime() abgeleitet von der kanonischen glibc-Version fügt %N hinzu und %:z und ein paar andere Änderungen. Variationen und gepatchte Versionen von strftime() gibt es zuhauf (einschließlich Versionen in bash und gawk).

Verwandte:Wie kann man überprüfen, auf welche Signale ein Prozess hört?
Linux
  1. So zeigen Sie das Datum und die Uhrzeit des Neustarts des Linux-Systems an

  2. So erhalten Sie eine formatierte Datumszeit in Python

  3. Befehl zum Abrufen der Zeit in Millisekunden

  4. Finden Sie Dateien, die zwischen einem Datumsbereich erstellt wurden

  5. Linux-Shell:Umbenennen von Dateien zur Erstellungszeit

So finden Sie das Installationsdatum und die Uhrzeit des Linux-Betriebssystems

11 Nützliche Beispiele für Linux-Datumsbefehle

So stellen Sie Datum und Uhrzeit unter Linux ein

Zeitanzeige zeigt Datum/Uhrzeit nicht an?

Beispiele für Linux-Datumsbefehle

So ändern Sie Datum, Uhrzeit und Zeitzone in Linux Mint 20