choisir un horaire avec sleep

9 réponses
Avatar
Thomas
bonjour :-)


je souhaite pouvoir lancer un script sh n'importe quand, et qu'il
s'exécute Í  une heure choisie

est ce que c'est pas trop compliqué Í  faire ?


il me semble qu'il devrais suffire d'ajouter un `sleep` au début,
en calculant la durée d'attente dont on a besoin, en fonction de l'heure
qu'il est au moment du lancement et de l'heure choisie pour l'exécution

mais je n'arrive pas Í  aller au bout :
j'ai trouvé qu'avec `date` on peut afficher en langage humain une date
donnée en seconde, mais pas le contraire ...

donc j'ai besoin d'un peu d'aide svp :-)

--
Téléassistance / Télémaintenance
http://invites.biocer.fr/thomas-de-contes/

9 réponses

Avatar
Christophe PEREZ
Le Mon, 07 Dec 2020 02:38:12 +0100, Thomas a écrit :
je souhaite pouvoir lancer un script sh n'importe quand, et qu'il
s'exécute Í  une heure choisie
est ce que c'est pas trop compliqué Í  faire ?

Le logiciel "at" fait ça.
http://blog.calhariz.com/index.php/tag/at
il me semble qu'il devrais suffire d'ajouter un `sleep` au début,
en calculant la durée d'attente dont on a besoin, en fonction de l'heure
qu'il est au moment du lancement et de l'heure choisie pour l'exécution
mais je n'arrive pas Í  aller au bout :

C'est faisable, mais ça fait un peu usine Í  gaz pour refaire un truc
existant.
j'ai trouvé qu'avec `date` on peut afficher en langage humain une date
donnée en seconde, mais pas le contraire ...

$ date -d "2020-12-06 22:50:14" "+%s"
1607309414
Avatar
Francois Lafont
Hello,
Sauf erreur de ma part, avec la commande `date`, ce n'est pas si usine Í  gaz
que ça, non ?
-----------------------------------------------------
#!/bin/sh
hour="23:00:00"
go=$(date -d "$1" "+%s")
now=$(date "+%s")
# 86400 seconds in 24h.
delta=$(( (go - now + 86400) % 86400 ))
# Sleep until $hour...
sleep "$delta"
-----------------------------------------------------
Testé sous Ubuntu 18.04.
La petite astuce est de faire le delta et d'y ajouter 86400 (le nombre de secondes
dans 24h) pour avoir quelque chose de positif Í  coup sÍ»r et ensuite de réduire la
valeur modulo 86400 pour avoir une valeur entre 0 et (86400-1).
Il me semble que ça marche, non ?
À+
--
François Lafont
Avatar
Marc SCHAEFER
Francois Lafont wrote:
Hello,
Sauf erreur de ma part, avec la commande `date`, ce n'est pas si usine Í  gaz
que ça, non ?

de mémoire:
echo commande | at $hour
echo commande | at now + 5min
Avatar
Christophe PEREZ
Le Mon, 07 Dec 2020 12:12:08 +0100, Francois Lafont a écrit :
Sauf erreur de ma part, avec la commande `date`, ce n'est pas si usine Í 
gaz que ça, non ?

Refaire l'existant, tu l'appelles bien comme tu veux, mais pour moi c'est
perdre du temps, sans avoir la garantie d'avoir testé tous les cas pour
être sÍ»r de n'avoir aucun bug.
Alors comme j'ai pour habitude de dire, si c'est pour le fun du
challenge, oui bien sÍ»r que ça vaut le coup. Mais dans ce cas lÍ , il faut
quand même être un minimum capable de trouver soit même la syntaxe pour
avoir une sortie date en secondes.
Mais si c'est pour avoir quelque chose de fonctionnel le plus rapidement
possible, c'est une usine Í  gaz.
Note bien que dans ton post, tu ne quotes RIEN, mais que le demandeur
avait lui-même posé la question :
Le Mon, 07 Dec 2020 02:38:12 +0100, Thomas a écrit :
est ce que c'est pas trop compliqué Í  faire ?

Ça pouvait laisser penser qu'il ne souhaitait justement pas se lancer
dans quelque chose de compliqué.
et j'ai répondu :
Le Mon, 07 Dec 2020 02:55:11 +0000, Christophe PEREZ a écrit :
C'est faisable, mais ça fait un peu usine Í  gaz pour refaire un truc
existant.
Avatar
Thomas
In article <rqk5if$10g$,
Christophe PEREZ wrote:
Le Mon, 07 Dec 2020 02:38:12 +0100, Thomas a écrit :
je souhaite pouvoir lancer un script sh n'importe quand, et qu'il
s'exécute Í  une heure choisie
est ce que c'est pas trop compliqué Í  faire ?

Le logiciel "at" fait ça.
http://blog.calhariz.com/index.php/tag/at

désolé, on dirait que ça ne lance pas les choses Í  l'heure prévue :
quand j'enregistre une commande avec at (est ce que je m'y prend bien ?)
c'est bien enregistré dans atq
thomas$ echo 'sleep 600' | at 23:20
+ echo 'sleep 600'
+ at 23:20
job 6 at Thu Dec 10 23:20:00 2020
thomas$ atq
+ atq
...
6 Thu Dec 10 23:20:00 2020
thomas$
mais, le moment venu, il ne se passe rien, et c'est tjr enregistré dans
atq ...
bon, comme je suis tjr sous mac os x 10.6.8 (en voie d'ordinosauration)
c'est peut être pour ça,
tant pis, j'ai pas envie de passer longtemps Í  chercher
il me semble qu'il devrais suffire d'ajouter un `sleep` au début,
en calculant la durée d'attente dont on a besoin, en fonction de l'heure
qu'il est au moment du lancement et de l'heure choisie pour l'exécution
mais je n'arrive pas Í  aller au bout :

C'est faisable, mais ça fait un peu usine Í  gaz pour refaire un truc
existant.

tant pis, je l'ai fait quand même
mais merci d'avoir essayé :-)
--
Téléassistance / Télémaintenance
http://invites.biocer.fr/thomas-de-contes/
Avatar
Thomas
In article <5fce0e08$0$13556$,
Francois Lafont wrote:
Hello,
Sauf erreur de ma part, avec la commande `date`, ce n'est pas si usine Í  gaz
que ça, non ?
-----------------------------------------------------
#!/bin/sh
go=$(date -d "$1" "+%s")

chez moi ça ne marche pas,
tant pis, j'ai mis les calculs explicites, c'est pas grave !
now=$(date "+%s")

ça marche !
ouf, c'est le plus important, sinon j'etais coincé ...
# 86400 seconds in 24h.
delta=$(( (go - now + 86400) % 86400 ))
-----------------------------------------------------
Testé sous Ubuntu 18.04.

et ça marche ?
delai=$(( (heureChoisie + secondesDans1j - heureMaintetant) %
secondesDans1j ))
chez moi ça donne un nb négatif !
(sleep ne fait pas d'erreur mais n'attend pas)
La petite astuce est de faire le delta et d'y ajouter 86400 (le nombre de
secondes
dans 24h) pour avoir quelque chose de positif ͠ coup sͻr et ensuite de
réduire la
valeur modulo 86400 pour avoir une valeur entre 0 et (86400-1).
Il me semble que ça marche, non ?

bien vu, je ne sais pas si j'y aurais pensé
par contre si ça marche chez toi, c'est peut être parce que
$(date "+%s")
ne te donne que l'heure du jour, pas la date ?
chez moi c'est l'horodatage complet, depuis "l'époque" je crois ;-)
donc ça fonctionne avec
delai=$(( ( (heureChoisie + 2*secondesDans1j) - (heureMaintetant %
secondesDans1j) ) % secondesDans1j ))
merci bcp, ton modèle m'a permis d'avancer très vite, et maintenant
c'est en place :-))
--
Téléassistance / Télémaintenance
http://invites.biocer.fr/thomas-de-contes/
Avatar
Francois Lafont
Bonjour,
On 12/15/20 10:53 PM, Thomas wrote:
In article <5fce0e08$0$13556$,
Francois Lafont wrote:
Hello,
Sauf erreur de ma part, avec la commande `date`, ce n'est pas si usine Í  gaz
que ça, non ?
-----------------------------------------------------
#!/bin/sh

go=$(date -d "$1" "+%s")

chez moi ça ne marche pas,
tant pis, j'ai mis les calculs explicites, c'est pas grave !
now=$(date "+%s")

ça marche !
ouf, c'est le plus important, sinon j'etais coincé ...
# 86400 seconds in 24h.
delta=$(( (go - now + 86400) % 86400 ))

-----------------------------------------------------
Testé sous Ubuntu 18.04.

et ça marche ?

Alors oui mais j'avais mal fait mon copier/coller. Désolé. Ceci dit,
pas sÍ»r que ce soit la raison de tes différences avec moi que, je
l'avoue, je n'ai pas trop pigées.
DéjÍ  voici le bon copier/coller (toujours sous Ubuntu 18.04). Dans mon
message précédent, je m'étais mélangé les crayons avec une variable
"hour" pas utilisée (mea culpa) :
------------------------------------------------------
~$ cat /tmp/test.sh
#!/bin/sh
# Ça c'est l'heure d'exécution au format par exemple "23:31:59"
# ie « Heures:minutes:secondes ». On en fait un argument du script
# pour faire des tests facilement.
hour="$1"
go=$(date -d "$hour" "+%s")
now=$(date "+%s")
# 86400 seconds in 24h.
delta=$(( (go - now + 86400) % 86400 ))
echo sleep "$delta"
echo next code...
------------------------------------------------------
Et voici quelques exemples d'exécution :
~$ echo Heure du moment $(date '+%T') && /tmp/test.sh '01:53:50'
Heure du moment 01:53:40
sleep 10
next code...
~$ echo Heure du moment $(date '+%T') && /tmp/test.sh '01:53:50'
Heure du moment 01:53:43
sleep 7
next code...
~$ echo Heure du moment $(date '+%T') && /tmp/test.sh '01:53:50'
Heure du moment 01:53:48
sleep 2
next code...
~$ echo Heure du moment $(date '+%T') && /tmp/test.sh '01:53:50'
Heure du moment 01:53:50
sleep 0
next code...
~$ echo Heure du moment $(date '+%T') && /tmp/test.sh '01:53:50'
Heure du moment 01:53:52
sleep 86398
next code...
~$ echo Heure du moment $(date '+%T') && /tmp/test.sh '01:53:50'
Heure du moment 01:53:54
sleep 86396
next code...
delai=$(( (heureChoisie + secondesDans1j - heureMaintetant) %
secondesDans1j ))
chez moi ça donne un nb négatif !
(sleep ne fait pas d'erreur mais n'attend pas)

Désolé, je ne pige pas. Sans doute que l'erreur est avant.
bien vu, je ne sais pas si j'y aurais pensé
par contre si ça marche chez toi, c'est peut être parce que
$(date "+%s")
ne te donne que l'heure du jour, pas la date ?
chez moi c'est l'horodatage complet, depuis "l'époque" je crois ;-)

date "+%s" me donne aussi le temps Unix :
~$ date "+%s"
1608080285
C'est voulu car, pour faire des additions ou des soustractions de dates, tout
est beaucoup plus simple une fois les dates exprimées sous forme de simples
entiers.
donc ça fonctionne avec
delai=$(( ( (heureChoisie + 2*secondesDans1j) - (heureMaintetant %
secondesDans1j) ) % secondesDans1j ))

Désolé, je suis largué. Tant mieux si ceci fonctionne pour toi.
merci bcp, ton modèle m'a permis d'avancer très vite, et maintenant
c'est en place :-))

Cool.
À+
--
François Lafont
Avatar
Thomas
In article <rqlfbg$ful$,
Christophe PEREZ wrote:
Alors comme j'ai pour habitude de dire, si c'est pour le fun du
challenge, oui bien sÍ»r que ça vaut le coup. Mais dans ce cas lÍ , il faut
quand même être un minimum capable de trouver soit même la syntaxe pour
avoir une sortie date en secondes.

je comprend le principe,
mais lÍ  j'ai trouvé la doc disponible dure Í  comprendre, tandis qu'une
fois ce pb lÍ  débloqué, tout le reste est allé tout seul ...
--
RAPID maintainer
http://savannah.nongnu.org/projects/rapid/
Avatar
Thomas
In article <5fd95cfc$0$13563$,
Francois Lafont wrote:
DéjÍ  voici le bon copier/coller (toujours sous Ubuntu 18.04). Dans mon
message précédent, je m'étais mélangé les crayons avec une variable
"hour" pas utilisée (mea culpa) :
------------------------------------------------------
~$ cat /tmp/test.sh
#!/bin/sh
# Ça c'est l'heure d'exécution au format par exemple "23:31:59"
# ie « Heures:minutes:secondes ». On en fait un argument du script
# pour faire des tests facilement.
hour="$1"
go=$(date -d "$hour" "+%s")
now=$(date "+%s")
# 86400 seconds in 24h.
delta=$(( (go - now + 86400) % 86400 ))
echo sleep "$delta"
echo next code...
------------------------------------------------------
Et voici quelques exemples d'exécution :

c'est super bizarre :
- ton calcul semble buggé,
- mais tes exemples montrent qu'effectivement ça fonctionne ...
delai=$(( (heureChoisie + secondesDans1j - heureMaintetant) %
secondesDans1j ))
chez moi ça donne un nb négatif !
(sleep ne fait pas d'erreur mais n'attend pas)

Désolé, je ne pige pas. Sans doute que l'erreur est avant.

delai = delta
heureChoisie = go
heureMaintetant = now
secondesDans1j = 86400
bien vu, je ne sais pas si j'y aurais pensé
par contre si ça marche chez toi, c'est peut être parce que
$(date "+%s")
ne te donne que l'heure du jour, pas la date ?
chez moi c'est l'horodatage complet, depuis "l'époque" je crois ;-)

date "+%s" me donne aussi le temps Unix :
~$ date "+%s"
1608080285

c'est donc cette valeur qui se retrouve dans now,
donc le mystère c'est : comment on obtient un bon résultat alors que tu
ne fais pas le "% 86400" dessus avant tout autre chose ??
donc ça fonctionne avec
delai=$(( ( (heureChoisie + 2*secondesDans1j) - (heureMaintetant %
secondesDans1j) ) % secondesDans1j ))

Désolé, je suis largué. Tant mieux si ceci fonctionne pour toi.

dis moi si tu aimerais comprendre,
sinon, maintenant que ça fonctionne chez moi comme je le souhaite, on
peut laisser tomber, c'est comme tu veux :-)
--
RAPID maintainer
http://savannah.nongnu.org/projects/rapid/