Une autre préoccupation avec l'approche "watch" proposée ci-dessus est qu'elle affiche le résultat uniquement lorsque le processus est terminé.
"date; sleep 58; date" affichera les 2 dates seulement après 59 secondes ... Si vous démarrez quelque chose pendant 4 minutes, qui affichent lentement plusieurs pages de contenu, vous ne le verrez pas vraiment.
D'autre part, le problème avec l'approche "while" est qu'il ne prend pas en compte la durée de la tâche.
while true; do script_that_take_between_10s_to_50s.sh; sleep 50; done
Avec cela, le script s'exécutera parfois toutes les minutes, parfois il faudra 1m40. Donc, même si un cron peut l’exécuter toutes les minutes, ici ce ne sera pas le cas.
Donc, pour voir le résultat sur le shell tel qu'il est généré et attendre l'heure exacte de la requête, vous devez regarder l'heure avant et après, et boucler avec le temps.
Quelque chose comme:
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
Cela va afficher ceci:
Comme vous pouvez le voir, la commande s'exécute toutes les minutes:
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
Il suffit donc de remplacer la commande "sleep echo $(( ( RANDOM % 30 ) + 1 ))
" par ce que vous voulez et qui sera exécuté, sur le terminal / shell, exactement à chaque minute. Si vous voulez un autre programme, changez simplement les "60" secondes avec tout ce dont vous avez besoin.
Version plus courte sans les lignes de débogage:
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