Realice un command cada X segundos

Deseo realizar un command cada 10 segundos y ejecutarlo en segundo plano (¿eliminando así la watch ?). Todas las respuestas muestran algo como lo siguiente, pero esto se ejecutará cada 11 a 14 segundos. ¿Cómo se puede lograr esto?

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

Qué tal si:

 ( # 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: con todos esos comentarios, alternativas y la subshell para protección adicional, parece mucho más complicado de lo que comenzó. Entonces, para comparar, esto es lo que parecía antes de empezar a preocuparme por wait o kill , ¡con sus $! y necesidad de aislamiento:

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

El rest es realmente solo para cuando lo necesites.

Puede hacer algo como lo siguiente en bash , zsh o ksh :

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

Esto es lo que dice el manual bash sobre $SECONDS :

$SECONDS

  • Cada vez que se hace reference a este parámetro, la cantidad de segundos desde que se devuelve la invocación del shell. Si se asigna un valor a $SECONDS , el valor devuelto en references posteriores es el número de segundos desde la asignación más el valor asignado. Si $SECONDS está unset , pierde sus properties especiales, incluso si se restablece posteriormente.

Aquí hay un ejemplo de trabajo:

 ( 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 solamente: también puede calcular el time pasado por su command y restar de 10:

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

De BASH man:

TIMEFORMAT El valor de este parámetro se utiliza como una cadena de formatting que especifica cómo se debe mostrar la información de temporización para las tuberías con el prefijo de la palabra reservada en el time. El carácter% introduce una secuencia de escape que se expande a un valor de time u otra información. Las secuencias de escape y sus significados son los siguientes; las llaves indican porciones opcionales.
%% A literal%.
% [p] [l] R El time transcurrido en segundos.
% [p] [l] U El número de segundos de CPU gastados en modo de usuario.
% [p] [l] S La cantidad de segundos de CPU gastados en el modo sistema.
% P El porcentaje de CPU, calculado como (% U +% S) /% R.

El p opcional es un dígito que especifica la precisión, el número de dígitos fraccionarios después de un punto decimal. Un valor de 0 no causa la salida de ningún punto decimal o fracción.