J'ai besoin de créer un travail CRON qui s'exécutera le dernier jour de chaque mois. Je vais le créer en utilisant cPanel.
Toute aide est appréciée. Merci
la source
J'ai besoin de créer un travail CRON qui s'exécutera le dernier jour de chaque mois. Je vais le créer en utilisant cPanel.
Toute aide est appréciée. Merci
Le moyen le plus simple est peut-être d'effectuer trois tâches distinctes:
55 23 30 4,6,9,11 * myjob.sh
55 23 31 1,3,5,7,8,10,12 * myjob.sh
55 23 28 2 * myjob.sh
Cela se déroulera le 28 février, même les années bissextiles, donc si cela pose un problème, vous devrez trouver un autre moyen.
Cependant, il est généralement à la fois beaucoup plus facile et correct d'exécuter le travail dès que possible le premier jour de chaque mois, avec quelque chose comme:
0 0 1 * * myjob.sh
et modifiez le script pour traiter les données du mois précédent .
Cela supprime tous les tracas que vous pourriez rencontrer pour déterminer quel jour est le dernier du mois, et garantit également que toutes les données pour ce mois sont disponibles, en supposant que vous traitez des données. Courir entre cinq minutes et minuit le dernier jour du mois peut vous voir manquer tout ce qui se passe entre ce moment et minuit.
C'est la façon habituelle de le faire de toute façon, pour la plupart des emplois de fin de mois.
Si vous voulez vraiment l' exécuter le dernier jour du mois, une option consiste simplement à détecter si demain est le premier (soit dans le cadre de votre script, soit dans le crontab lui-même).
Donc, quelque chose comme:
55 23 28-31 * * [[ "$(date --date=tomorrow +\%d)" == "01" ]] && myjob.sh
devrait être un bon début, en supposant que vous ayez un date
programme relativement intelligent .
Si votre date
programme n'est pas assez avancé pour vous donner des dates relatives, vous pouvez simplement créer un programme très simple pour vous donner le jour du mois de demain (vous n'avez pas besoin de toute la puissance de date
), tel que:
#include <stdio.h>
#include <time.h>
int main (void) {
// Get today, somewhere around midday (no DST issues).
time_t noonish = time (0);
struct tm *localtm = localtime (&noonish);
localtm->tm_hour = 12;
// Add one day (86,400 seconds).
noonish = mktime (localtm) + 86400;
localtm = localtime (&noonish);
// Output just day of month.
printf ("%d\n", localtm->tm_mday);
return 0;
}
puis utilisez (en supposant que vous l'avez appelé tomdom
pour "le jour du mois de demain"):
55 23 28-31 * * [[ "$(tomdom)" == "1" ]] && myjob.sh
Bien que vous voudrez peut - être envisager d' ajouter un contrôle d'erreur puisque les deux time()
et mktime()
peut revenir -1
si quelque chose se passe mal. Le code ci-dessus, pour des raisons de simplicité, n'en tient pas compte.
Il existe une méthode légèrement plus courte qui peut être utilisée, similaire à l'une de celles ci-dessus. C'est:
En outre, l'entrée crontab pourrait être mise à jour pour ne vérifier que le 28 au 31 car il est inutile de l'exécuter les autres jours du mois. Ce qui vous donnerait:
la source
/bin/sh: -c: line 1: unexpected EOF while looking for matching ')'
.[ $(date -d +1day +\%d) -eq 1 ] && run_job
posix
et la date POSIX ne prend pas en charge"-d +1day"
: - \ Une solution plus compliquée (et moche) serait:[ `date +\%d` -eq `cal | xargs echo | awk '{print $NF}'` ] && myscript.sh
Configurez une tâche cron à exécuter le premier jour du mois. Modifiez ensuite l'horloge du système pour qu'elle soit un jour à l'avance.
la source
Et celui-ci, après Wikipédia?
la source
Adaptant la solution de paxdiablo, je cours les 28 et 29 février. Les données du 29 écrasent le 28.
la source
,29
.55 23 28 2
?Vous pouvez configurer une tâche cron à exécuter tous les jours du mois et lui faire exécuter un script shell comme celui-ci. Ce script détermine si le numéro du jour de demain est inférieur à celui d'aujourd'hui (c'est-à-dire si demain est un nouveau mois), puis fait ce que vous voulez.
la source
Pour une méthode plus sûre dans une crontab basée sur la solution @Indie (utiliser le chemin absolu vers
date
+$()
ne fonctionne pas sur tous les systèmes crontab):la source
Certaines implémentations cron prennent en charge l'indicateur "L" pour représenter le dernier jour du mois.
Si vous avez la chance d'utiliser l'une de ces implémentations, c'est aussi simple que:
Cela se déroulera à 23 h 55 le dernier jour de chaque mois.
http://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger
la source
la source
Pour l'implémentation cron d'AWS Cloudwatch (planification de Lambdas, etc.), cela fonctionne:
Diffusion à 23 h 55 le dernier jour de chaque mois.
la source
Consultez une question connexe sur le forum unix.com.
la source
Vous pouvez simplement connecter toutes les réponses en une seule ligne cron et utiliser uniquement la
date
commande.Vérifiez simplement la différence entre le jour du mois qui est aujourd'hui et le sera demain:
Si ces différences sont inférieures à 0, cela signifie que nous changeons le mois et qu'il y a le dernier jour du mois.
la source
la source
Et ça?
modifier l'
.bashprofile
ajout de l'utilisateur :Ajoutez ensuite cette entrée à crontab:
la source
Le dernier jour du mois peut être du 28 au 31 selon le mois (février, mars, etc.). Cependant, dans l'un ou l'autre de ces cas, le jour suivant est toujours le 1er du mois suivant. Nous pouvons donc l'utiliser pour nous assurer d'exécuter une tâche toujours le dernier jour du mois en utilisant le code ci-dessous:
la source