CronJob toutes les 25 minutes

13

Je veux savoir s'il existe un moyen plus simple d'exécuter un travail toutes les 25 minutes. Dans cronjob, si vous spécifiez le paramètre minute comme * / 25, il ne s'exécutera qu'à la 25e et 50e minute de chaque heure

Pappu
la source

Réponses:

15

La commande dans crontab est exécutée avec /bin/shafin 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

cronexé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_commandfonctionner en même temps tous les jours, mais il se passe toutes les 25 minutes.

camh
la source
simplement génial ...
Tomas
Notez qu'avec l'implémentation cron de l'ISC, vous devrez au moins échapper ces% caractères avec barre oblique inverse.
Stéphane Chazelas
@ StéphaneChazelas, bon point. J'ai continué et ajouté les barres obliques inverses avant les signes de pourcentage, car à ma connaissance, chaque implémentation de cron l'exige.
CODE-REaD
7

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.

Douglas Leeder
la source
6

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
che2cbs
la source
Où voyez-vous 25 minutes ici?
Philomath
Utiliser fcron et @ 25 commanddevrait faire l'affaire.
Caleb
Merci Caleb. J'aurais dû créer un exemple sur mesure au lieu d'en retirer un directement dans la documentation.
che2cbs
2

Permettez-moi d'expliquer brièvement quel est le problème ici. La saisie de 25 dans le champ des minutes entraîne l' cronexé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 ...

Philomath
la source
Peut-être que la réponse aurait dû être un commentaire sur la question d'origine.
Philomath
1

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/tmpau lieu de /tmpparce que selon le FHS, il n'est pas censé être supprimé lors de l'arrêt / démarrage du système.

SamK
la source
-2

Je pense que ce qui suit devrait fonctionner 0 0/25 * * *?


la source
Selon ma connaissance, cela fonctionnera pour chaque minute.
Cela s'exécuterait à l'heure une fois toutes les ... 25 heures? 0/25 ... je ne sais même pas ce que ça fait mais ce n'est pas ce que l'OP est après.
Caleb