Sto usando OpenWRT su Arduino YUN e sto cercando di ottenere la data esatta in millisecondi (GG/MM/AAAA h:min:sec:ms) ottenendo l'ora da un timeserver.
Sfortunatamente date +%N
restituisce solo %N
, ma non i nanosecondi. Ho sentito +%N
non è incluso nella data di OpenWRT.
Quindi c'è un modo per ottenere la data (inclusi i millisecondi) come voglio?
Risposta accettata:
Su OpenWRT, date
è busybox
, che ha dei limiti, ma questo non è strettamente uno di questi. Il problema di fondo è che la libc (uClibc) non supporta questa estensione GNU strftime. (Anche se nemmeno glibc lo fa, ne parleremo più avanti.)
Dovresti avere lua
per impostazione predefinita, ma ciò non aiuterà senza altri moduli non predefiniti.
hwclock
chiama gettimeofday()
per confrontare/impostare l'RTC (orologio hardware), ma non produrrà una risoluzione inferiore al secondo (l'accesso agli RTC può essere sufficientemente lento da non essere comunque utile). A parte questo, OpenWRT fornisce solo l'antico rdate
, che ha solo una risoluzione al secondo intero.
Non sembra esserci un modo semplice per ottenere un timestamp accurato direttamente da /proc
, il timestamp più utile è in /proc/timer_list
(3a riga) che è il tempo di attività in nanosecondi (la risoluzione dipenderà dalla piattaforma).
Se la tua busybox è stata creata con CONFIG_BUSYBOX_CONFIG_ADJTIMEX
set, dovresti essere in grado di usare adjtimex
per leggere l'orologio del kernel (sebbene si noti che la versione busybox ha entrambi argomenti diversi e output diverso rispetto allo standard adjtimex.
Versione normale, adjtimex -p
, ultima riga di output:
raw time: 1416419719s 146628us = 1416419719.146628
Versione Busybox, adjtimex
(senza -p
!), ultime 3 righe:
[...]
time.tv_sec: 1416420386
time.tv_usec: 732653
return value: 0 (clock synchronized)
Quella di Goldilocks è un'ottima soluzione, supponendo che tu abbia la tua configurazione di build incrociata OpenWRT (altamente consigliata!).
La tua coreutils-date la soluzione funziona perché mentre coreutils è a conoscenza di glibc, non è esclusivamente glibc. Viene fornito con la propria implementazione autonoma di strftime
(derivato da glibc) e lo usa per concludere (tramite strftime_case()
) il sottostante strftime
in modo da supportare varie estensioni (e in caso contrario tornare alla versione uClibc).
Anche glibc (fino all'attuale 2.23) non supporta %N
, le coreutils strftime()
derivato dalla versione canonica di glibc aggiunge %N
e %:z
e poche altre modifiche. Variazioni e versioni con patch di strftime()
abbondano (comprese le versioni in bash e gawk).