web-dev-qa-db-fra.com

Cron job tous les trois jours

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

74
tmartin314

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

0 0 */3 * *

Comment sur cela?

Si vous souhaitez qu'il s'exécute certains jours du mois, comme les 1er, 4e, 7e, etc.

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

ou, comme @mario le fait remarquer, 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.

100
sberry
* * */3 * *  that says, every minute of every hour on every three days. 

0 0 */3 * *  says at 00:00 (midnight) every three days.
62
tareco

Parce que cron est "sans état", il ne peut pas exprimer avec précision les "fréquences", mais uniquement les "motifs" auxquels il (apparemment) correspond continuellement avec le temps actuel.

En reformulant votre question, cela devient plus évident: "est-il possible d'exécuter un cronjob à 00h01 tous les soirs sauf les nuits de saut qui avaient été exécutées en moins de 2 nuits?" Lorsque cron compare l'heure actuelle aux modèles de temps de demande de travail, cron ne peut pas savoir s'il a déjà exécuté votre travail.

(Il est certainement possible d’écrire un cron avec état qui enregistre les travaux passés et inclut donc des modèles de correspondance avec cet état, mais ce n’est pas le cron standard inclus dans la plupart des systèmes d’exploitation. Un tel système serait compliqué en exigeant l’introduction du concept de Lorsque de tels modèles sont "réinitialisés". Par exemple, le modèle est-il réinitialisé lorsque l'heure est modifiée (c.-à-d. que l'entrée de la crontab est modifiée)? Regardez dans votre application de calendrier préférée pour voir à quel point il peut être difficile d'exprimer des modèles répétitifs d'événements planifiés notez qu'ils n'ont pas le problème de réinitialisation, car l'événement de calendrier de départ a une date de "réinitialisation" naturelle. Commencez par replanifier un événement de calendrier récurrent toutes les semaines afin de différer d'une semaine, au-dessus de Noël. Par exemple, vous devez généralement mettre fin à cet événement récurrent et en redémarrer un autre, ce qui illustre bien l’expressivité limitée de la façon dont même les applications de calendrier compliquées représentent des schémas récurrents. of state-- chaque événement individuel peut être supprimé ou reprogrammé indépendamment [dans la plupart des applications d'agenda]).

De plus, vous voudrez probablement faire votre travail tous les 3 nuits en cas de succès, mais si le dernier échoue, 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). Clairement, cron ne peut pas savoir si votre travail a réussi et le motif ne peut pas non plus exprimer un autre calendrier de "tentatives" plus fréquent.

TOUJOURS-- Vous pouvez faire ce que vous voulez vous-même. Ecrivez un script, dites à Cron de le lancer tous les soirs à 00h01. Ce script peut vérifier l’horodatage de quelque chose * qui enregistre la "dernière exécution" et, s’il ya plus de 3 jours **, exécute le travail et réinitialise 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 heure 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.

13
Jaime Guerrero

Je ne suis pas un spécialiste cron, mais que dire de:

0 */72 * * *

Il fonctionnera toutes les 72 heures sans interruption.

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

11
Fabio Nolasco
0 0 1-30/3 * *

Cela se déroulerait tous les trois jours à partir du 1er. Voici les 20 parcours prévus -

  • 2015-06-01 00:00:00
  • 2015-06-04 00:00:00
  • 2015-06-07 00:00:00
  • 2015-06-10 00:00:00
  • 2015-06-13 00:00:00
  • 2015-06-16 00:00:00
  • 2015-06-19 00:00:00
  • 2015-06-22 00:00:00
  • 2015-06-25 00:00:00
  • 2015-06-28 00:00:00
  • 2015-07-01 00:00:00
  • 2015-07-04 00:00:00
  • 2015-07-07 00:00:00
  • 2015-07-10 00:00:00
  • 2015-07-13 00:00:00
  • 2015-07-16 00:00:00
  • 2015-07-19 00:00:00
  • 2015-07-22 00:00:00
  • 2015-07-25 00:00:00
  • 2015-07-28 00:00:00
7
Vishal

Que diriez-vous:

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

every est 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, il fonctionne tous les jours.

En utilisant */3 s'exécute les 3, 6, ..., 27 et 30 du mois, mais est ensuite erroné après un 31e jour. Le script every n'est erroné qu'après la fin de l'année.

3
MattBlissett

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 sur tous les n jours du mois et pas tous les n jours. Voir: explication ici . À la fin du mois, un problème récurrent est garanti.

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 un calcul modulo à la commande en cours d'exécution pour obtenir la valeur 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 à 12h00, mais ne sera exécuté que lorsque le nombre de jours écoulés depuis le 01-01-1970 modulo 3 sera é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
2
Brad Cozine

Vous devriez apprendre les bases de crontab.

Editez le cron avec la commande crontab -e et alors ⌃ (CTRL) + X puis Y et enfin appuyez sur ENTER (return) sur mac pour enregistrer le fichier. Vous pouvez vérifier que les nouveaux crons ont été installés ou pas par crontab -l

Un fichier crontab contient 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: Setup Cron in Unix

2
Ahmad Awais

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

Sinon, configurez-le pour qu'il s'exécute quotidiennement, mais faites que votre script phon cron se ferme plus tôt avec:

if (! (date("z") % 3)) {
     exit;
}
1
mario

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

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

0
Tanner

Si vous souhaitez qu'il s'exécute certains jours du mois, comme les 1er, 4e, 7e, etc.

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

0
Colin Hilbert