Outra preocupação com a abordagem "watch" proposta acima é que ela exibe o resultado apenas quando o processo é concluído.
"date; sleep 58; date" exibirá as 2 datas somente após 59 segundos ... Se você iniciar algo em execução por 4 minutos, que exiba lentamente várias páginas de conteúdo, você realmente não o verá.
Por outro lado, a preocupação com a abordagem "while" é que ela não leva em consideração a duração da tarefa.
while true; do script_that_take_between_10s_to_50s.sh; sleep 50; done
Com isso, o script será executado a cada minuto, em algum momento pode levar 1m40. Portanto, mesmo que um cron possa executá-lo a cada minuto, aqui não será.
Então, para ver a saída no shell conforme ela é gerada e esperar pelo tempo exato de solicitação, você precisa olhar o tempo antes e depois e fazer o loop com o tempo.
Algo como:
while ( true ); do
echo Date starting 'date'
before='date +%s'
sleep 'echo $(( ( RANDOM % 30 ) + 1 ))'
echo Before waiting 'date'
after='date +%s'
DELAY='echo "60-($after-$before)" | bc'
sleep $DELAY
echo Done waiting 'date'
done
Isso produzirá isso:
Como você pode ver, o comando é executado a cada minuto:
Date starting Mon Dec 14 15:49:34 EST 2015
Before waiting Mon Dec 14 15:49:52 EST 2015
Done waiting Mon Dec 14 15:50:34 EST 2015
Date starting Mon Dec 14 15:50:34 EST 2015
Before waiting Mon Dec 14 15:50:39 EST 2015
Done waiting Mon Dec 14 15:51:34 EST 2015
Então apenas substitua o comando "sleep echo $(( ( RANDOM % 30 ) + 1 ))
" pelo que você quiser e que será executado, no terminal / shell, exatamente a cada minuto. Se você quiser outro horário, basta alterar os "60" segundos com o que precisar.
Versão mais curta sem as linhas de depuração:
while ( true ); do
before='date +%s'
sleep 'echo $(( ( RANDOM % 30 ) + 1 ))' # Place you command here
after='date +%s'
DELAY='echo "60-($after-$before)" | bc'
sleep $DELAY
done