Otázka
Chtěl bych umět spustit příkaz UNIX přesně každou sekundu po dlouhé časové období .
Potřebuji řešení, které po určité době nezůstává pozadu, kvůli času, který samotný příkaz potřebuje k provedení. spát , sledovat a určitý python skript všechno mě v tomto ohledu zklamalo.
Na mikrokontrolérech, jako je http://Arduino.cc, bych to udělal prostřednictvím přerušení hardwarových hodin.
Zajímalo by mě, zda existuje podobné řešení skriptu shellu s přesným časem. Všechna řešení, která jsem našel na StackExchange.com, vedla ke znatelné časové prodlevě, pokud běží přes hodiny. Podrobnosti viz níže.
Praktický účel / aplikace
Chci otestovat, zda je moje připojení k síti nepřetržitě aktivní, odesíláním časových razítek přes nc
(netcat) každou 1 sekundu.
Odesílatel:
precise-timestamp-generator | tee netcat-sender.txt | nc $receiver $port
Přijímač:
nc -l -p $port > netcat-receiver.txt
Po dokončení porovnejte dva protokoly:
diff netcat-sender.txt netcat-receiver.txt
Rozdíly by byly nepřenesené časové značky.
Z toho bych věděl, kdy má moje LAN / WAN / ISP problémy.
Řešení SLEEP
while [ true ]; do date "+%Y-%m-%d %H:%M:%S" ; sleep 1; done | tee timelog-sleep.txt
Získá určitý posun v průběhu času, protože příkaz ve smyčce také trvá trochu času.
Přesnost
cat timelog-sleep.txt
2012-07-16 00:45:16
[...]
2012-07-16 10:20:36
Uplynulé sekundy:34520
wc -l timelog-sleep.txt
Řádky v souboru:34243
Shrnutí přesnosti:
- 34520-34243 =277 problémů s časováním
- 34520/34243 =1,008 =sleva 0,8 %
Řešení REPEAT PYTHON
Nalezeno na:Opakujte příkaz Unix každých x sekund navždy
repeat.py 1 "date '+%Y-%m-%d %H:%M:%S'" >> timelog-repeat-py.txt
Předpokládá se, že se vyhýbá časovému posunu, ale neučiní tak.
Přesnost
wc -l timelog-repeat-py.txt
2012-07-16 13:42:44
[...]
2012-07-16 16:45:24
Uplynulé sekundy:10960
wc -l timelog-repeat-py.txt
Řádky v souboru:10859
Shrnutí přesnosti:
- 10960-10859 =101 problémů s časováním
- 10960/10859 =1,009 =sleva 0,9 %
WATCH řešení
watch -n 1 "date '+%Y-%m-%d %H:%M:%S' >> ~/Desktop/timelog-watch.txt"
Přesnost
wc -l timelog-watch.txt
2012-07-16 11:04:08
[...]
2012-07-16 13:25:47
Uplynulé sekundy:8499
wc -l timelog-watch.txt
Řádky v souboru:8366
Shrnutí přesnosti:
- 8499-8366 =133 problémů s časováním.
- 8499/8366 =1,016 =sleva 1,6 %.
Přijatá odpověď:
Jak funguje tento skript v Perlu, který jsem právě vytvořil?
#!/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();
}
Použijte:perl timer.pl 1 date '+%Y-%m-%d %H:%M:%S'
Běží 45 minut bez jediného přeskočení a mám podezření, že to tak bude pokračovat, pokud a) zatížení systému nezvýší tak, že fork() trvá déle než sekundu, nebo b) nevložíte přestupnou sekundu.
Nemůže však zaručit, že se příkaz spustí v přesných sekundových intervalech, protože je zde určitá režie, ale pochybuji, že je to mnohem horší než řešení založené na přerušení.
Související:Jak zjistit, zda bootuji pomocí UEFI?
Spustil jsem to asi hodinu s date +%N
(nanosekundy, rozšíření GNU) a spustil o tom nějaké statistiky. Největší zpoždění bylo 1 155 mikrosekund. Průměr (aritmetický průměr) 216 µs, medián 219 µs, směrodatná odchylka 42 µs. V 95 % případů běžel rychleji než 270 µs. Nemyslím si, že to můžete překonat jinak než pomocí programu C.