[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