GNU/Linux >> Linux Esercitazione >  >> Linux

Eseguire il comando Unix esattamente a intervalli molto brevi senza accumulare ritardi nel tempo?

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.


Linux
  1. Come eseguire un comando senza proprietà di root?

  2. Controlla quanto tempo impiega uno script Bash per essere eseguito con il comando Time

  3. Trucchi della riga di comando:come identificare la data e l'ora di un'esecuzione di un comando Unix

  4. Come copiare file in Linux e Unix? 10 cp Esempi di comandi

  5. Come eseguire lo script come un altro utente senza password?

Come eseguire un comando con limite di tempo (timeout) in Linux

Comando dell'ora di Linux

Comando principale di Linux

Come eseguire il comando Sudo senza password

Come eseguire un comando per un tempo specifico in Linux

Esegui comandi con un limite di tempo in Ubuntu 20.04