Se o seu sistema estiver sincronizado com ntp (verifique ntpq -crv
para "sync_ntp" no status e / ou /usr/sbin/ntptime
para o código "0 (OK)" e PLL ou FLL, mas não UNSYNC para status), então date
e todos os amigos retornam o tempo exato, estimado como estando fora do valor de "deslocamento" (que normalmente é vários ms, muito melhor do que você jamais configuraria seu relógio)
Eu costumava usar um script em Perl como este para definir meu relógio, antes de ter um que se definia:
#!/usr/bin/perl
use strict;
use utf8;
use Time::HiRes qw(gettimeofday usleep);
binmode STDOUT, ':utf8';
# Set up start conditions
my ($timer, $residual) = gettimeofday;
usleep(1e6 - $residual);
$residual = 0;
++$timer;
my $correction = 0;
while (1) {
usleep(1e6 + $residual + $correction);
++$timer;
my ($m_s, $m_µs) = gettimeofday;
$correction = (1e6*($timer - $m_s) - $m_µs);
$residual += $correction;
if ($correction < 5_000 && $correction > -5_000) {
# if within 5ms
print "\a ".localtime($timer)."\t${correction} µs\n";
} else {
print "x ".localtime($timer)."\t${correction} µs\n";
}
}
Execute-o em um terminal. Ele tenta exibir a hora a cada segundo, junto com a emissão de um bip terminal, se ele acertar em 5ms. Claro, verdade seja dita, a latência para produzir o sinal sonoro é provavelmente mais do que 5ms, como é o tempo que leva o seu cérebro para reconhecer e responder ao sinal sonoro.
(Eu suponho que você poderia adicionar algo em que o computador primeiro testou seu tempo de reação fazendo com que você pressionasse uma tecla quando você ouve o sinal sonoro, e então usou isso para tocar o bipe um pouco mais cedo para cancelar seu tempo de reação.)