Exécuter la command toutes les X secondes

Je souhaite exécuter une command de 10 secondes et la faire exécuter en tâche de fond (éliminant ainsi la watch ?). Toutes les réponses montrent quelque chose comme ce qui suit, mais cela n'exécutera jamais 11 à 14 secondes. Comment cela peut-il être accompli?

 while true; do # perform command that takes between 1 and 4 seconds sleep 10 done 

Que diriez-vous:

 ( # In a subshell, for isolation, protecting $! while true; do perform-command & # in the background sleep 10 ; ### If you want to wait for a perform-command ### that happens to run for more than ten seconds, ### uncomment the following line: # wait $! ; ### If you prefer to kill a perform-command ### that happens to run for more than ten seconds, ### uncomment the following line instead: # kill $! ; ### (If you prefer to ignore it, uncomment neither.) done ) 

ETA: Avec tous ces commentaires, alternatives, et le sous-shell pour une protection supplémentaire, cela semble beaucoup plus compliqué que cela a commencé. Donc, à titre de comparaison, voici à quoi il ressemblait avant de commencer à m'inquiéter d' wait ou de kill , avec leur $! et besoin d'isolement:

 while true; do perform-command & sleep 10 ; done 

Le rest est vraiment juste pour quand vous en avez besoin.

Vous pouvez faire quelque chose comme ceci dans bash , zsh ou ksh :

 SECONDS=0 while command do sleep "$((10-(SECONDS%10)))" done 

Voici ce que le manuel de bash dit à propos de $SECONDS :

$SECONDS

  • Chaque fois que ce paramètre est référencé, le nombre de secondes depuis l'invocation du shell est renvoyé. Si une valeur est affectée à $SECONDS , la valeur renvoyée sur les references suivantes est le nombre de secondes depuis l'affectation plus la valeur atsortingbuée. Si $SECONDS est unset , il perd ses propriétés spéciales, même s'il est réinitialisé par la suite.

Voici un exemple de travail:

 ( SECONDS=0 while sleep "$((RANDOM%10))" do sleep "$((10-(SECONDS%10)))" echo "$SECONDS" done ) 

 10 20 30 40 50 60 70 80 90 100 

BASH seulement – Vous pouvez également calculer le time passé par votre command et soustraire de 10:

 TIMEFORMAT=$'%0R' while true; do T=$({ time command; } 2>&1) sleep $(( 10-T )) 

De l'homme BASH:

TIMEFORMAT La valeur de ce paramètre est utilisée comme string de format spécifiant comment les informations de temporisation pour les pipelines préfixées par le mot de time réservé doivent être affichées. Le caractère% introduit une séquence d'échappement qui est étendue à une valeur de time ou à d'autres informations. Les séquences d'échappement et leurs significations sont les suivantes; les accolades désignent des portions optionnelles.
%% Un% littéral.
% [p] [l] R Temps écoulé en secondes.
% [p] [l] U Nombre de secondes CPU consommées en mode user.
% [p] [l] S Nombre de secondes CPU dépensées en mode système.
% P Le pourcentage de CPU, calculé comme (% U +% S) /% R.

Le p optionnel est un chiffre spécifiant la précision, le nombre de numbers fractionnaires après un point décimal. Une valeur de 0 n'entraîne pas la sortie d'un point décimal ou d'une fraction.