[gull] truc et astuce: utiliser sleep pour atteindre un ``moment''

Félix Hauri felix at f-hauri.ch
Fri Jan 21 21:03:01 CET 2005


Tout d'abord:
$ set | grep -i sh.*version
BASH_VERSION='2.05a.0(1)-release'

Pour calculer un nombre de secondes, deux méthodes:
$ echo $((((24+3)*60+46)*60+40))
100000
$ date -ud '1970-1-1 UTC +1 day 3 hour 46 min 40 secs' +%s
100000

L'opération inverse:
$ date -ud '1970-1-1 UTC +100000 secs' +%j-%T
002-03:46:40
(Ne pas oublier d'enlever 1 jour,
 cela ne fonctionne plus après 365jours;)
ou alors:
$ echo $(( 100000 / 86400 )) day $(( 100000 % 86400 / 3600 )) hour \
    $(( 100000 % 3600 /60 )) min $(( 100000 % 60 )) secs
1 day 3 hour 46 min 40 secs

Pour calculer un ``sleep'' qui arrive sur les prochaines 5 minutes:
$ delay=$(date -ud '1970-1-1 UTC +5 min' +%s)

D'abord le décallage sur les 5 minutes arrondies:
$ offset=$(( ($(date +%s) - SECONDS) % delay ));

Enfin le nombre de secondes à attendre avant les prochaines
  5 minutes arrondies:
$ sleep $(( delay - ( SECONDS + offset ) % delay ));date
Fri Jan 21 19:40:00 CET 2005

ou sans attendre:
$ date -d "now +  $(( delay - ( SECONDS + offset ) % delay )) secs"
Fri Jan 21 19:40:00 CET 2005

Maintenant, on peut aussi le faire avec CRON:
$ sleep $((9**9)) & # une bonne douzaine d'années
$ echo kill $! | at "now +$(( delay/60 - ( SECONDS + offset ) % delay /60 )) min"
warning: commands will be executed using /bin/sh
job 344 at 2005-01-21 19:40
pts/16|felix at medium[felix]$ fg;date
sleep $((9**9))
Terminated
ven jan 21 19:40:00 CET 2005

Amusez-vous bien.

--
 Félix Hauri  -  <felix at f-hauri.ch>  -  http://www.f-hauri.ch



More information about the gull mailing list