Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

croner une tâche séquentiellement

18 réponses
Avatar
Stan
Bonjour,

Le titre n'est pas du tout évocateur ;-)

Je souhaite lancer une tâche toutes les 5 mn;
cependant, si cette dernière prend plus de 5mn,
je ne veux pas relancer une autre tâche avant que la précédente
ne soit terminée.

Comment résoudre cette contrainte le plus élégament possible ?
Merci d'avance.
--
-Stan

8 réponses

1 2
Avatar
Nicolas George
Olivier Miakinen wrote in message <4718daa0$:
300 secondes = 5 fois 60 secondes = 5 minutes


Et évidemment, si le boulot prend typiquement 40 secondes, on pourra réduire
la pause à 260.

Avatar
Stan
"Olivier Miakinen" <om+ a écrit dans le message de
news:4718daa0$

Je reformule ma question :
quelle est le rôle de la pause ?


Puisqu'il faut mettre les points sur les i :

300 secondes = 5 fois 60 secondes = 5 minutes


oops.
Voilà ce que c'est que de faire deux choses à la fois ;-)

Mais en fait, cette solution ne me satisfait qu'a moitié;
dans l'idéal, il faudrait que tant que la durée de traitement est
inférieure à 5 mn, je garde la granularité de 5mn;
mais si le traitement dépasse les 5 mn, idéalement,
il faudrait enchainer avec un nouveau traitement...

--
-Stan


Avatar
Nicolas George
"Stan" wrote in message <ffamsm$tmq$:
Mais en fait, cette solution ne me satisfait qu'a moitié;
dans l'idéal, il faudrait que tant que la durée de traitement est
inférieure à 5 mn, je garde la granularité de 5mn;
mais si le traitement dépasse les 5 mn, idéalement,
il faudrait enchainer avec un nouveau traitement...


Avec zsh + GNU date :

while true; do
next=$[`date +%s`+300]
something
now=`date +%s`
(( now < next )) && sleep $[next-now]
done

On doit pouvoir remplacer les zshismes par des appels à expr.

Avatar
Olivier Miakinen

Avec zsh + GNU date :

while true; do
next=$[`date +%s`+300]
something
now=`date +%s`
(( now < next )) && sleep $[next-now]
done


Joli.

Avatar
Thierry B.
--{ Stan a plopé ceci: }--

Je souhaite lancer une tâche toutes les 5 mn;
cependant, si cette dernière prend plus de 5mn,
je ne veux pas relancer une autre tâche avant que la précédente
ne soit terminée.

Comment résoudre cette contrainte le plus élégament possible ?


Euh, à la gruik, la tache se relance d'elle-même avec "at"
en calculant le temps qu'elle a mis à s'exécuter ?

--
Marrant, à l'époque on craignait que le forum soit inondé de trolls et
maintenant on craint qu'on ne puisse plus y écrire depuis Wanadoo.
--{ PL, dans fufe }--

Avatar
Stephane Chazelas
2007-10-19, 16:54(+00), Nicolas George:
"Stan" wrote in message <ffamsm$tmq$:
Mais en fait, cette solution ne me satisfait qu'a moitié;
dans l'idéal, il faudrait que tant que la durée de traitement est
inférieure à 5 mn, je garde la granularité de 5mn;
mais si le traitement dépasse les 5 mn, idéalement,
il faudrait enchainer avec un nouveau traitement...


Avec zsh + GNU date :

while true; do
next=$[`date +%s`+300]
something
now=`date +%s`
(( now < next )) && sleep $[next-now]
done

On doit pouvoir remplacer les zshismes par des appels à expr.


$[...] est un bashisme, ((...)) est un kshisme (et zsh supporte
les deux). La syntaxe ($[...]) est deprecated. L'equivalent
standard est $((...)) qui est POSIX.

Et bash comme zsh comme ksh ont $SECONDS (qui n'est pas POSIX):

while :; do
SECONDS=0
something
(( SECONDS > 300)) && sleep "$((300 - SECONDS))"
done

Sinon, tout simplement:

while :; do
{ something >&3 3>&- | sleep 300; } 3>&1
done

Ou si something n'est censé rien produire sur sa sortie standard:

while :; do
something > /dev/null | sleep 300
done

ou

while :; do
sleep 300 | something
done

si something n'est pas censé lire sur son entree standard.

--
Stéphane


Avatar
Stan
"Thierry B." a écrit dans le message de
news:
--{ Stan a plopé ceci: }--

Je souhaite lancer une tâche toutes les 5 mn;
cependant, si cette dernière prend plus de 5mn,
je ne veux pas relancer une autre tâche avant que la précédente
ne soit terminée.

Comment résoudre cette contrainte le plus élégament possible ?


Euh, à la gruik, la tache se relance d'elle-même avec "at"
en calculant le temps qu'elle a mis à s'exécuter ?



En effet, c'est une piste...

--
-Stan


Avatar
Stan
"Stephane Chazelas" a écrit dans le message de
news:

[...]

Ou si something n'est censé rien produire sur sa sortie standard:

while :; do
something > /dev/null | sleep 300
done

ou

while :; do
sleep 300 | something
done

si something n'est pas censé lire sur son entree standard.



Merci à tous pour vos suggessions;
je fais tester ça...

--
-Stan

1 2