Réponses:
La commande dans crontab est exécutée avec /bin/sh
afin que vous puissiez utiliser l'expansion arithmétique pour calculer si la minute actuelle modulo 25 est égale à zéro:
*/5 * * * * [ $(( $(date +\%s) / 60 \% 25 )) -eq 0 ] && your_command
cron
exécutera l'intégralité de cette entrée toutes les 5 minutes, mais uniquement si la minute actuelle (en minutes depuis l'époque) modulo 25 est égale à zéro, elle s'exécutera your_command
.
Comme d' autres l' ont souligné, 1 jour ne sont pas divisibles par 25 minutes, cela ne fera pas de your_command
fonctionner en même temps tous les jours, mais il se passe toutes les 25 minutes.
Votre meilleur pari est de courir à 20 minutes ou 30 minutes.
Le mieux serait de déclencher toutes les 5 minutes, puis de conserver un décompte interne ou un horodatage, et d'exécuter tous les 5 déclencheurs, ou si 25 minutes se sont écoulées depuis la dernière exécution.
Plus compliqué serait de déterminer les heures correctes d'une journée, à partir de minuit, et d'accepter l'erreur à la fin de la journée. Cela impliquerait de dupliquer l'entrée crontab aux différentes heures.
Plus compliqué que cela serait de calculer les temps pour un mois entier, ce qui impliquerait de nombreuses copies de l'entrée crontab pour couvrir les différentes combinaisons.
Enfin, vous pouvez implémenter votre propre toujours sur le démon, et faire faire la planification.
Je n'ai aucune expérience directe avec cela, mais fcron semble faire ce que vous voulez hors de la boîte. Selon sa documentation, vous pouvez spécifier des fréquences:
# Get our mails every 30 minutes
@ 30 getmails -all
# make some security tests every 48 hours of system up time,
# force a mail to be sent to root even if there is no output
@mailto(root),forcemail 2d /etc/security/msec/cron-sh/security.sh
@ 25 command
devrait faire l'affaire.
Permettez-moi d'expliquer brièvement quel est le problème ici. La saisie de 25 dans le champ des minutes entraîne l' cron
exécution lorsque les minutes de l'heure actuelle sont égales à 25, c'est-à-dire une fois par heure. Vous pouvez entrer une liste de correspondances, le problème est que 60 (minutes d'une heure) ne sont pas divisibles par 25, vous devez donc ajouter plusieurs entrées en fonction de l'heure. Le multiple le moins commun de 60 et 25 est 300, c'est-à-dire 5 * 60. vous devrez donc faire un cycle de 5 heures jusqu'à revenir à votre début d'origine. par exemple:
0, 25, 50
15, 40
5, 30, 55
20, 45
10, 35
...
Mais là encore, 24 (heures par jour) n'est pas divisible par 5, le multiple le plus commun de 5 et 24 est simplement 5 * 24 = 120. Et ainsi de suite ...
Vous pouvez jouer avec la dernière heure de modification d'un fichier
Créez un petit script (par exemple /usr/local/bin/age
) qui affichera l'âge d'un fichier:
#bin/sh
echo $(( $( date +%s ) - $( stat -c %Z $1 ) ))
Votre crontab ressemblerait à ceci (en supposant que 25 minutes équivalent à 1500 secondes si j'ai raison)
* * * * * [ $(/usr/local/bin/fileage /var/tmp/your_command.offset) -gt 1500 ] && touch /var/tmp/your_command.offset && your_command
Notez que j'utilise /var/tmp
au lieu de /tmp
parce que selon le FHS, il n'est pas censé être supprimé lors de l'arrêt / démarrage du système.
Je pense que ce qui suit devrait fonctionner 0 0/25 * * *?