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.