GNU/Linux >> Tutoriels Linux >  >> Linux

Exécuter la commande Unix avec précision à des intervalles très courts sans accumuler de décalage dans le temps ?

Question

J'aimerais pouvoir exécuter une commande UNIX précisément chaque seconde sur une longue période .

J'ai besoin d'une solution qui ne tarde pas après un certain temps, en raison du temps nécessaire à l'exécution de la commande elle-même. dormir , regarder , et un certain script python tout m'a échoué à cet égard.

Sur les microcontrôleurs tels que http://Arduino.cc, je le ferais via des interruptions d'horloge matérielle.
J'aimerais savoir s'il existe une solution similaire de script shell précis dans le temps. Toutes les solutions que j'ai trouvées dans StackExchange.com ont entraîné un décalage notable, si elles sont exécutées pendant des heures. Voir les détails ci-dessous.

Objectif pratique / application

Je veux tester si ma connexion réseau est continuellement active en envoyant des horodatages via nc (netcat) toutes les 1 seconde.

Expéditeur :

precise-timestamp-generator | tee netcat-sender.txt | nc $receiver $port

Destinataire :

nc -l -p $port > netcat-receiver.txt

Une fois terminé, comparez les deux journaux :

diff netcat-sender.txt netcat-receiver.txt

Les différences seraient les horodatages non transmis.
À partir de là, je saurais à quelle heure mon LAN / WAN / FAI pose problème.

Solution SOMMEIL

while [ true ]; do date "+%Y-%m-%d %H:%M:%S" ; sleep 1; done | tee timelog-sleep.txt

Obtient un certain décalage dans le temps, car la commande dans la boucle prend également un peu de temps.

Précision

cat timelog-sleep.txt

2012-07-16 00:45:16
[...]
2012-07-16 10:20:36

Secondes écoulées :34520

wc -l timelog-sleep.txt

Lignes dans le fichier :34243

Précision résumée :

  • 34520-34243 =277 problèmes de synchronisation
  • 34520/34243 =1,008 =0,8 % de réduction

Solution RÉPÉTER PYTHON

Trouvé à :répéter une commande Unix toutes les x secondes pour toujours

repeat.py 1 "date '+%Y-%m-%d %H:%M:%S'" >> timelog-repeat-py.txt

Censé éviter le décalage horaire, mais ne le fait pas.

Précision

wc -l timelog-repeat-py.txt

2012-07-16 13:42:44
[...]
2012-07-16 16:45:24

Secondes écoulées :10960

wc -l timelog-repeat-py.txt

Lignes dans le fichier :10859

Précision résumée :

  • 10960-10859 =101 problèmes de synchronisation
  • 10960/10859 =1,009 =0,9 % de réduction

VEILLER SUR LA SOLUTION

watch -n 1 "date '+%Y-%m-%d %H:%M:%S' >> ~/Desktop/timelog-watch.txt"

Précision

wc -l timelog-watch.txt
2012-07-16 11:04:08
[...]
2012-07-16 13:25:47

Secondes écoulées :8499

wc -l timelog-watch.txt

Lignes dans le fichier :8366

Précision résumée :

  • 8499-8366 =133 problèmes de synchronisation.
  • 8499/8366 =1,016 =1,6 % de réduction.

Réponse acceptée :

Comment fonctionne ce script Perl que je viens de créer ?

#!/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();
}

Utiliser :perl timer.pl 1 date '+%Y-%m-%d %H:%M:%S'

Il a fonctionné 45 minutes sans un seul saut, et je soupçonne qu'il continuera à le faire à moins que a) la charge du système ne devienne si élevée que fork() prenne plus d'une seconde ou b) une seconde intercalaire est insérée.

Il ne peut cependant pas garantir que la commande s'exécute à des intervalles exacts de secondes, car il y a une surcharge, mais je doute que ce soit bien pire qu'une solution basée sur les interruptions.

Connexe :Comment savoir si je démarre avec UEFI ?

Je l'ai exécuté pendant environ une heure avec date +%N (nanosecondes, extension GNU) et a exécuté des statistiques dessus. Le plus grand décalage était de 1 155 microsecondes. Moyenne (moyenne arithmétique) 216 µs, médiane 219 µs, écart type 42 µs. Il a couru plus vite que 270 µs 95% du temps. Je ne pense pas que vous puissiez le battre sauf avec un programme C.


Linux
  1. DSH - Exécutez une commande Linux sur plusieurs hôtes à la fois

  2. Vérifiez combien de temps un script bash prend pour s'exécuter avec la commande Time

  3. Astuces de ligne de commande :comment identifier la date et l'heure d'exécution d'une commande Unix

  4. Suivre le temps que prend une commande sous UNIX/LINUX ?

  5. Rediriger la sortie de la commande time sous unix vers une variable bash ?

Comment exécuter une commande avec limite de temps (Timeout) sous Linux

Commande de temps Linux

Commande principale Linux

Comment exécuter la commande Sudo sans mot de passe

Comment exécuter une commande pendant une durée spécifique sous Linux

Exécuter des commandes avec une limite de temps dans Ubuntu 20.04