Cron job tous les trois jours

93

Est-il possible d'exécuter un cronjob tous les trois jours? Ou peut-être 10 fois / mois.

tmartin314
la source
4
Oui, c'est possible et cela appartient à SuperUser.
Une exécution tous les 3 jours, indépendamment des limites du mois, peut être effectuée avec anacron.
ryanpattison

Réponses:

125

Exécutez-le tous les trois jours ...

0 0 */3 * *

Et ça?

Si vous voulez qu'il s'exécute à des jours spécifiques du mois, comme le 1er, 4e, 7e, etc ... alors vous pouvez simplement avoir un conditionnel dans votre script qui vérifie le jour en cours du mois.

if (((date('j') - 1) % 3))
   exit();

ou, comme le souligne @mario, vous pouvez utiliser la date ('k') pour obtenir le jour de l'année au lieu de le faire en fonction du jour du mois.

sberry
la source
9
@whatshakin: Cela dépendra de la précision que vous voulez "tous les trois jours". Cela fonctionnera tous les jours divisibles par 3. Sur les limites du mois, ce ne sera pas exact.
David
3
@whatshakin: La syntaxe de cronjob est même décrite sur Wikipedia: en.wikipedia.org/wiki/Cronjob
Felix Kling
4
C'est un résultat très élevé sur Google, et en tant que tel, il serait préférable que la réponse acceptée soit correcte, ce qui n'est pas le cas. Je pense que l'explication de Tareco est correcte.
lynks le
14
La réponse n'est pas correcte car aucune des suggestions n'exécute réellement le travail tous les 3 jours. 0 0 */3 * *signifie exécuté le 1er, le 4e, le 7e, etc. ( */3signifie 1-31/3signifie 1,4,7...31) donc l'écart sera plus petit à la fin du mois. (Il fonctionnera 2 jours de suite si le mois précédent comptait 31 jours.) Le date('j') % 3problème est similaire en ce que le modèle redémarre chaque année et que les années n'ont pas un nombre de jours divisible par 3.
cjm
8
Je trouve également regrettable que cela ait été accepté comme réponse. Je cherchais vraiment tous les N jours, indépendamment des limites du mois (des choses comme les plantes ne se soucient pas du jour du mois où elles reçoivent leur eau). Au moins, je pense avoir déterminé après avoir lu tous les commentaires, que la minuterie cron ne modélise pas entièrement ce désir.
Travis Griggs
69
* * */3 * *  that says, every minute of every hour on every three days. 

0 0 */3 * *  says at 00:00 (midnight) every three days.
tareco
la source
apprécier l'explication
pythonian29033
2
Cela se déclenche généralement tous les trois jours, mais peut tirer le lendemain au début d'un mois
Dziamid
24

Je ne suis pas un spécialiste cron, mais que diriez-vous:

0 */72 * * *

Il fonctionnera toutes les 72 heures sans interruption.

https://crontab.guru/#0_ / 72_ _ _

Fabio Nolasco
la source
3
C'est plus précis que la solution acceptée. La réponse acceptée échouera lors du changement de mois:then at 2019-02-28 00:00:00 then at 2019-03-01 00:00:00
Akira Yamamoto
Comment calcule-t-on quand cela se produira?
Bruce Edge
2
Selon crontab.guru, cela fonctionne tous les jours. Qui a raison?
velopper
1
La valeur dans la colonne des heures doit être comprise entre 0 et 23 selon crontab.guru et man crontab .
harperville
1
* / 72 est effectivement le même que 0. Cela s'exécute tous les minuit.
battey
19

Parce que cron est "sans état", il ne peut pas exprimer avec précision des "fréquences", seulement des "modèles" qu'il compare (apparemment) continuellement à l'heure actuelle.

La reformulation de votre question rend ceci plus évident: "est-il possible d'exécuter un cronjob à 00h01 tous les soirs sauf sauter des nuits alors qu'il s'était déroulé dans les 2 nuits?" Lorsque cron compare l'heure actuelle aux modèles de temps de demande de travail, il n'y a aucun moyen que cron puisse savoir s'il a exécuté votre travail dans le passé.

Habituellement, vous devez mettre fin à cet événement récurrent et en redémarrer un complètement nouveau; cela illustre l'expressivité limitée de la façon dont même les applications de calendrier complexes représentent des modèles répétitifs. Et bien sûr, les calendriers ont beaucoup d'états - chaque événement individuel peut être supprimé ou reprogrammé indépendamment [dans la plupart des applications de calendrier]).

De plus, vous voudrez probablement faire votre travail toutes les 3 nuits en cas de succès , mais si la dernière a échoué, réessayez immédiatement, peut-être la nuit suivante (ne pas attendre 3 jours de plus) ou même plus tôt, comme une heure plus tard (mais arrêtez de réessayer à l'arrivée du matin). De toute évidence, cron ne peut pas savoir si votre travail a réussi et le modèle ne peut pas non plus exprimer un autre calendrier de "relance" plus fréquent.

DE TOUTE MANIÈRE - Vous pouvez faire ce que vous voulez vous-même. Écrivez un script, dites à cron de l'exécuter tous les soirs à 00h01. Ce script pourrait vérifier l'horodatage de quelque chose * qui enregistre la "dernière exécution", et si c'était il y a> 3 jours **, effectuer le travail et réinitialiser l'horodatage de la "dernière exécution".

(* cet indicateur horodaté est un peu d'état persistant que vous pouvez manipuler et examiner, mais que cron ne peut pas)

** soyez prudent avec l'arithmétique du temps si vous utilisez une horloge lisible par l'homme - deux fois par an, certains jours ont 23 ou 25 heures dans leur journée, et 02: 00-02: 59 se produit deux fois par jour ou pas à tout. Utilisez UTC pour éviter cela.

Jaime Guerrero
la source
7
0 0 1-30/3 * *

Cela fonctionnerait tous les trois jours à partir du 1er. Voici les 20 exécutions programmées -

  • 01/06/2015 00:00:00
  • 04/06/2015 00:00:00
  • 07/06/2015 00:00:00
  • 10/06/2015 00:00:00
  • 13/06/2015 00:00:00
  • 16/06/2015 00:00:00
  • 19/06/2015 00:00:00
  • 22/06/2015 00:00:00
  • 25/06/2015 00:00:00
  • 28/06/2015 00:00:00
  • 01/07/2015 00:00:00
  • 04/07/2015 00:00:00
  • 07/07/2015 00:00:00
  • 10/07/2015 00:00:00
  • 13/07/2015 00:00:00
  • 16/07/2015 00:00:00
  • 19/07/2015 00:00:00
  • 22/07/2015 00:00:00
  • 25/07/2015 00:00:00
  • 28/07/2015 00:00:00
Vishal
la source
5
2015-07-31 00:00:00, 2015-08-01 00:00:00 ... OOPS seulement 1 jour entre les courses
Dziamid
4

Je ne pense pas que vous ayez ce dont vous avez besoin avec:

0 0 */3 * * ## <<< WARNING!!! CAUSES UNEVEN INTERVALS AT END OF MONTH!!

Malheureusement, le * / 3 définit l'intervalle tous les n jours du mois et non tous les n jours . Voir: explication ici . À la fin du mois, une émission récurrente est garantie.

1st  at 2019-02-01 00:00:00
then at 2019-02-04 00:00:00 << 3 days, etc. OK
then at 2019-02-07 00:00:00
...
then at 2019-02-25 00:00:00
then at 2019-01-28 00:00:00
then at 2019-03-01 00:00:00 << 1 day WRONG
then at 2019-03-04 00:00:00
...

Selon cet article , vous devez ajouter des maths modulo à la commande en cours d'exécution pour obtenir un TRUE "tous les N jours". Par exemple:

0 0 * * *  bash -c '(( $(date +\%s) / 86400 \% 3 == 0 )) && runmyjob.sh

Dans cet exemple, le travail sera vérifié quotidiennement à minuit, mais ne s'exécutera que lorsque le nombre de jours depuis le 01-01-1970 modulo 3 est égal à 0.

Si vous souhaitez que ce soit tous les 3 jours à partir d'une date spécifique, utilisez le format suivant:

0 0 * * *  bash -c '(( $(date +\%s -d "2019-01-01") / 86400 \% 3 == 0 )) && runmyjob.sh
Brad Cozine
la source
3

Que diriez-vous:

00 00  *  *   * every 3 days && echo test

everyest un script:

#!/bin/sh

case $2 in
    days)
        expr `date +%j` % $1 = 0 > /dev/null
        ;;

    weeks)
        expr `date +%V` % $1 = 0 > /dev/null
        ;;

    months)
        expr `date +%m` % $1 = 0 > /dev/null
        ;;
esac

Donc ça fonctionne tous les jours.

Utiliser des */3courses le 3, 6, ... 27, 30 du mois, mais est alors erroné après un mois a un 31e jour. Le everyscript n'est erroné qu'après la fin de l'année.

MattBlissett
la source
3

Vous devriez apprendre les bases de crontab.

Modifiez le cron par commande crontab -e, puis ⌃ (CTRL)+ Xpuis Yet enfin appuyez ENTER (return)sur mac pour enregistrer le fichier. Vous pouvez vérifier que les nouveaux crons ont été installés ou non encrontab -l

Un fichier crontab comporte cinq champs pour spécifier les minutes, les heures, le jour du mois, le mois et le jour de la semaine, suivis de la commande à exécuter à cet intervalle.

*     *     *   *    *   command to be executed
-     -     -   -    -
|     |     |   |    |
|     |     |   |    +----- day of week (0-6) (Sunday=0)
|     |     |   +------- month (1-12)
|     |     +--------- day of month (1-31)
|     +----------- hour (0-23)
+------------- min (0-59)

* dans le champ de valeur ci-dessus signifie toutes les valeurs légales comme entre accolades pour cette colonne.

Ici, j'ai écrit un article détaillé à ce sujet: Configurer Cron sous Unix

Ahmad Awais
la source
1

Ce serait plus simple si vous le configuriez pour qu'il s'exécute simplement, par exemple le lundi et le jeudi, ce qui lui donnerait une pause de 3 et 4 jours.

Sinon, configurez-le pour qu'il s'exécute quotidiennement, mais faites en sorte que votre script php cron se termine tôt avec:

if (! (date("z") % 3)) {
     exit;
}
mario
la source
0

Si vous voulez qu'il s'exécute à des jours spécifiques du mois, comme le 1er, 4e, 7e, etc ... alors vous pouvez simplement avoir un conditionnel dans votre script qui vérifie le jour en cours du mois.

Je pensais que tout ce dont vous aviez besoin pour cela était au lieu de * / 3 ce qui signifie tous les trois jours, utilisez 1/3 ce qui signifie tous les trois jours à partir du 1er du mois. donc 7/3 signifierait tous les trois jours à partir du 7 du mois, etc.

Colin Hilbert
la source
0

0 0 * * * [ $(($((date +% - j- 1)) % 3)) == 0 ] && script

Obtenez le jour de l'année à partir de date, décalé de 1 pour commencer à 0, vérifiez s'il s'agit du modulo trois.

Tanneur
la source
Ce hoquet ne se produira-t-il pas quand il passera d'une année non bissextile à l'année suivante, car ( 365-1 ) % 3 == 1 mais ( 1 - 1 ) % 3 == 0? Je pense que le meilleur calcul serait basé sur le nombre de jours depuis l'époque Unix.
kmoser