Execute o comando a cada X segundos

9

Eu desejo executar um comando a cada 10 segundos e executá-lo em segundo plano (eliminando assim watch ?). Todas as respostas mostram algo como o seguinte, mas isso irá executar sempre 11 a 14 segundos. Como isso pode ser feito?

while true; do
    # perform command that takes between 1 and 4 seconds
    sleep 10
done
    
por user1032531 10.10.2015 / 22:35

3 respostas

16

Que tal:

( # 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: Com todos esses comentários, alternativas e o subshell de proteção extra, isso parece muito mais complicado do que começou. Então, para comparação, aqui está o que parecia antes de começar a me preocupar com wait ou kill , com seus $! e necessidade de isolamento:

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

O resto é apenas para quando você precisa.

    
por 10.10.2015 / 22:54
8

Você pode fazer algo parecido com o seguinte em bash , zsh ou ksh :

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

Veja o que o manual bash diz sobre $SECONDS :

$SECONDS

  • Each time this parameter is referenced, the number of seconds since shell invocation is returned. If a value is assigned to $SECONDS, the value returned upon subsequent references is the number of seconds since the assignment plus the value assigned. If $SECONDS is unset, it loses its special properties, even if it is subsequently reset.

Aqui está um exemplo de trabalho:

(   SECONDS=0
    while   sleep   "$((RANDOM%10))"
    do      sleep   "$((10-(SECONDS%10)))"
            echo    "$SECONDS"
    done
)
10
20
30
40
50
60
70
80
90
100
    
por 10.10.2015 / 23:01
3

BASH only - Você também pode calcular o tempo gasto pelo seu comando e subtrair 10:

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

De BASH man:

TIMEFORMAT The value of this parameter is used as a format string specifying how the timing information for pipelines prefixed with the time reserved word should be displayed. The % character introduces an escape sequence that is expanded to a time value or other information. The escape sequences and their meanings are as follows; the braces denote optional portions.
%% A literal %.
%[p][l]R The elapsed time in seconds.
%[p][l]U The number of CPU seconds spent in user mode.
%[p][l]S The number of CPU seconds spent in system mode.
%P The CPU percentage, computed as (%U + %S) / %R.

The optional p is a digit specifying the precision, the number of fractional digits after a decimal point. A value of 0 causes no decimal point or fraction to be output.

    
por 10.10.2015 / 23:28