Vous avez */30
dans le spécificateur de minutes - cela signifie chaque minute mais avec un pas de 30 (en d'autres termes, toutes les demi-heures). Étant donné que cron
cela ne se résume pas à des résolutions de moins d'une minute, vous devrez trouver un autre moyen.
Une possibilité, bien que ce soit un peu compliqué (a) , est d'avoir deux tâches, une décalée de 30 secondes:
# Need these to run on 30-sec boundaries, keep commands in sync.
* * * * * /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )
Vous verrez que j'ai ajouté des commentaires et formaté pour vous assurer qu'il est facile de les synchroniser.
Les deux cron
travaux sont exécutés en fait chaque minute mais celui- ci on va attendre une demi - minute avant d' exécuter la « viande » du travail, /path/to/executable
.
Pour d'autres cron
options (non basées), voir les autres réponses ici, en particulier celles mentionnant fcron
et systemd
. Celles-ci sont probablement préférables en supposant que votre système a la capacité de les utiliser (comme installer fcron
ou avoir une distribution avec systemd
).
Si vous ne souhaitez pas utiliser la solution kludgy, vous pouvez utiliser une solution basée sur une boucle avec une petite modification. Vous devrez toujours gérer le maintien de votre processus sous une forme ou une autre, mais une fois trié, le script suivant devrait fonctionner:
#!/bin/env bash
# Debug code to start on minute boundary and to
# gradually increase maximum payload duration to
# see what happens when the payload exceeds 30 seconds.
((maxtime = 20))
while [[ "$(date +%S)" != "00" ]]; do true; done
while true; do
# Start a background timer BEFORE the payload runs.
sleep 30 &
# Execute the payload, some random duration up to the limit.
# Extra blank line if excess payload.
((delay = RANDOM % maxtime + 1))
((maxtime += 1))
echo "$(date) Sleeping for ${delay} seconds (max ${maxtime})."
[[ ${delay} -gt 30 ]] && echo
sleep ${delay}
# Wait for timer to finish before next cycle.
wait
done
L'astuce consiste à utiliser un sleep 30
mais à le démarrer en arrière - plan avant l'exécution de votre charge utile. Ensuite, une fois la charge utile terminée, attendez que l'arrière-plan sleep
se termine.
Si la charge utile prend n
quelques secondes (où n <= 30
), l'attente après la charge utile sera alors de 30 - n
quelques secondes. Si cela prend plus de 30 secondes, le cycle suivant sera retardé jusqu'à ce que la charge utile soit terminée, mais plus.
Vous verrez que j'ai du code de débogage là-dedans pour commencer sur une limite d'une minute pour rendre la sortie initialement plus facile à suivre. J'augmente également progressivement la durée maximale de la charge utile afin que vous finissiez par voir la charge utile dépasser le temps de cycle de 30 secondes (une ligne vierge supplémentaire est sortie, l'effet est donc évident).
Un cycle d'échantillonnage suit (où les cycles commencent normalement 30 secondes après le cycle précédent):
Tue May 26 20:56:00 AWST 2020 Sleeping for 9 seconds (max 21).
Tue May 26 20:56:30 AWST 2020 Sleeping for 19 seconds (max 22).
Tue May 26 20:57:00 AWST 2020 Sleeping for 9 seconds (max 23).
Tue May 26 20:57:30 AWST 2020 Sleeping for 7 seconds (max 24).
Tue May 26 20:58:00 AWST 2020 Sleeping for 2 seconds (max 25).
Tue May 26 20:58:30 AWST 2020 Sleeping for 8 seconds (max 26).
Tue May 26 20:59:00 AWST 2020 Sleeping for 20 seconds (max 27).
Tue May 26 20:59:30 AWST 2020 Sleeping for 25 seconds (max 28).
Tue May 26 21:00:00 AWST 2020 Sleeping for 5 seconds (max 29).
Tue May 26 21:00:30 AWST 2020 Sleeping for 6 seconds (max 30).
Tue May 26 21:01:00 AWST 2020 Sleeping for 27 seconds (max 31).
Tue May 26 21:01:30 AWST 2020 Sleeping for 25 seconds (max 32).
Tue May 26 21:02:00 AWST 2020 Sleeping for 15 seconds (max 33).
Tue May 26 21:02:30 AWST 2020 Sleeping for 10 seconds (max 34).
Tue May 26 21:03:00 AWST 2020 Sleeping for 5 seconds (max 35).
Tue May 26 21:03:30 AWST 2020 Sleeping for 35 seconds (max 36).
Tue May 26 21:04:05 AWST 2020 Sleeping for 2 seconds (max 37).
Tue May 26 21:04:35 AWST 2020 Sleeping for 20 seconds (max 38).
Tue May 26 21:05:05 AWST 2020 Sleeping for 22 seconds (max 39).
Tue May 26 21:05:35 AWST 2020 Sleeping for 18 seconds (max 40).
Tue May 26 21:06:05 AWST 2020 Sleeping for 33 seconds (max 41).
Tue May 26 21:06:38 AWST 2020 Sleeping for 31 seconds (max 42).
Tue May 26 21:07:09 AWST 2020 Sleeping for 6 seconds (max 43).
Si vous voulez éviter la solution kludgy, c'est probablement mieux. Vous aurez toujours besoin d'un cron
travail (ou équivalent) pour détecter périodiquement si ce script est en cours d'exécution et, sinon, le démarrer. Mais le script lui-même gère alors le timing.
(a) Certains de mes collègues diraient que les gourmandises sont ma spécialité :-)