GNU/Linux >> Znalost Linux >  >> Linux

Spouštět příkaz Unix přesně ve velmi krátkých intervalech, aniž by se hromadilo časové zpoždění?

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.


Linux
  1. Jak spustit příkaz bez vlastností root?

  2. Jak kopírovat soubory v Linuxu a Unixu? 10 cp Příklady příkazů

  3. Mohu v Unixu spustit 'make' v adresáři, aniž bych do tohoto adresáře nejprve cd'oval?

  1. Jak spustit skript jako jiný uživatel bez hesla?

  2. Je příkaz UNIX `time` dostatečně přesný pro benchmarky?

  3. Spusťte příkaz v bash bez uložení do historie

  1. DSH – Spusťte příkaz Linux na více hostitelích současně

  2. Triky příkazového řádku:Jak identifikovat datum a čas provedení příkazu Unixu

  3. 12 UNIX / Linux Příklady možností výstupního formátu časového příkazu