Domanda
Mi piacerebbe essere in grado di eseguire un comando UNIX precisamente ogni secondo per un lungo periodo di tempo .
Ho bisogno di una soluzione, che non resti indietro dopo un certo tempo, a causa del tempo necessario al comando stesso per l'esecuzione. dormi , guarda e un certo script python tutto mi ha deluso in questo senso.
Sui microcontrollori come http://Arduino.cc lo farei tramite gli interrupt hardware dell'orologio.
Vorrei sapere se esiste una soluzione di script di shell precisa nel tempo simile. Tutte le soluzioni che ho trovato all'interno di StackExchange.com, hanno comportato un notevole ritardo, se eseguite per ore. Vedi i dettagli di seguito.
Scopo pratico/applicazione
Voglio verificare se la mia connessione di rete è continuamente attiva inviando timestamp tramite nc
(netcat) ogni 1 secondo.
Mittente:
precise-timestamp-generator | tee netcat-sender.txt | nc $receiver $port
Ricevitore:
nc -l -p $port > netcat-receiver.txt
Al termine, confronta i due log:
diff netcat-sender.txt netcat-receiver.txt
Le differenze sarebbero i timestamp non trasmessi.
Da questo saprei a che ora la mia LAN / WAN / ISP crea problemi.
Soluzione SONNO
while [ true ]; do date "+%Y-%m-%d %H:%M:%S" ; sleep 1; done | tee timelog-sleep.txt
Ottiene un certo offset nel tempo, poiché anche il comando all'interno del ciclo richiede un po' di tempo.
Precisione
cat timelog-sleep.txt
2012-07-16 00:45:16
[...]
2012-07-16 10:20:36
Secondi trascorsi:34520
wc -l timelog-sleep.txt
Righe in archivio:34243
Precisione riassunta:
- 34520-34243 =277 problemi di tempistica
- 34520/34243 =1,008 =0,8% di sconto
Soluzione REPEAT PYTHON
Trovato in:ripeti un comando Unix ogni x secondi per sempre
repeat.py 1 "date '+%Y-%m-%d %H:%M:%S'" >> timelog-repeat-py.txt
Dovrebbe evitare la differenza di tempo, ma non riesce a farlo.
Precisione
wc -l timelog-repeat-py.txt
2012-07-16 13:42:44
[...]
2012-07-16 16:45:24
Secondi trascorsi:10960
wc -l timelog-repeat-py.txt
Righe in archivio:10859
Precisione riassunta:
- 10960-10859 =101 problemi di tempistica
- 10960/10859 =1,009 =0,9% di sconto
Soluzione GUARDA
watch -n 1 "date '+%Y-%m-%d %H:%M:%S' >> ~/Desktop/timelog-watch.txt"
Precisione
wc -l timelog-watch.txt
2012-07-16 11:04:08
[...]
2012-07-16 13:25:47
Secondi trascorsi:8499
wc -l timelog-watch.txt
Righe in archivio:8366
Precisione riassunta:
- 8499-8366 =133 problemi di temporizzazione.
- 8499/8366 =1,016 =1,6% di sconto.
Risposta accettata:
Come funziona questo script Perl che ho appena creato?
#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes qw/time sleep/;
sub launch {
return if fork;
exec @_;
die "Couldn't exec";
}
$SIG{CHLD} = 'IGNORE';
my $interval = shift;
my $start = time();
while (1) {
launch(@ARGV);
$start += $interval;
sleep $start - time();
}
Usa:perl timer.pl 1 date '+%Y-%m-%d %H:%M:%S'
È stato eseguito per 45 minuti senza un solo salto e sospetto che continuerà a farlo a meno che a) il carico del sistema non diventi così alto che fork() impiega più di un secondo o b) venga inserito un secondo intercalare.
Tuttavia, non può garantire che il comando venga eseguito a intervalli di secondi esatti, poiché c'è un sovraccarico, ma dubito che sia molto peggio di una soluzione basata su interrupt.
Correlati:come sapere se sto eseguendo l'avvio utilizzando UEFI?
L'ho eseguito per circa un'ora con date +%N
(nanosecondi, estensione GNU) ed ha eseguito alcune statistiche su di esso. Il ritardo massimo che ha avuto è stato di 1 155 microsecondi. Media (media aritmetica) 216 µs, mediana 219 µs, deviazione standard 42 µs. Ha funzionato più velocemente di 270 µs il 95% delle volte. Non credo che tu possa batterlo se non con un programma C.