Est-il possible d'exécuter un cronjob tous les trois jours? Ou peut-être 10 fois / mois.
Est-il possible d'exécuter un cronjob tous les trois jours? Ou peut-être 10 fois / mois.
Réponses:
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.
0 0 */3 * *
signifie exécuté le 1er, le 4e, le 7e, etc. ( */3
signifie 1-31/3
signifie 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') % 3
problè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.
* * */3 * * that says, every minute of every hour on every three days.
0 0 */3 * * says at 00:00 (midnight) every three days.
Je ne suis pas un spécialiste cron, mais que diriez-vous:
0 */72 * * *
Il fonctionnera toutes les 72 heures sans interruption.
then at 2019-02-28 00:00:00 then at 2019-03-01 00:00:00
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.
0 0 1-30/3 * *
Cela fonctionnerait tous les trois jours à partir du 1er. Voici les 20 exécutions programmées -
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
Que diriez-vous:
00 00 * * * every 3 days && echo test
Où 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 ça fonctionne tous les jours.
Utiliser des */3
courses le 3, 6, ... 27, 30 du mois, mais est alors erroné après un mois a un 31e jour. Le every
script n'est erroné qu'après la fin de l'année.
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
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;
}
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.
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.
( 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.