J'ai besoin qu'un certain script s'exécute une fois par mois (d'autres qui consultent cette question peuvent avoir besoin qu'il soit exécuté une fois par jour/semaine/année/5 jours, etc.).
Je sais que je peux utiliser cron pour le faire avec :
0 0 1 * * ./script.sh
Mais que se passe-t-il si la machine se trouve être hors ligne pendant cet intervalle (coupure de courant le 1er d'un mois particulier, par exemple).
Y a-t-il un élégant solution à cela? Ou devrais-je inclure une sous-routine dans ce script pour définir un I've-run-this-month-already
valeur, puis un autre script exécuté tous les jours du mois (ou au démarrage) pour vérifier cette valeur ?
Mise à jour :
J'ai besoin que mon script s'exécute une fois par mois au tout début du mois. Lors de l'écriture d'un script pour accomplir un certain nombre de choses, j'ai créé le morceau de code ci-dessous. Je ne le mets ici qu'au cas où quelqu'un le trouverait utile après avoir trouvé cette question.
# CHECK FOR THE OLD_MONTH FILE
if [ ! -e /usr/local/bin/system/old_month ]; then
# CREATE IT IF IT DOESN'T EXIST WITH THIS MONTHS DATE
echo `date` | awk '{print $2,$6}' > /usr/local/bin/system/old_month
fi
# CREATE A NEW FILE EVERY TIME THIS SCRIPT IS RUN WITH THIS MONTHS DATE
echo `date` | awk '{print $2,$6}' > /usr/local/bin/system/this_month
# CHECK IF OLD_MONTH AND THIS_MONTH ARE NOT THE SAME
if ! cmp /usr/local/bin/system/this_month /usr/local/bin/system/old_month > /dev/null 2>&1 ;
then
# RUN YOUR RELEVANT CODE HERE #
echo `date` | awk '{print $2,$6}' > /usr/local/bin/system/old_month # UPDATE THE VALUE IN OLD_MONTH SO THAT THEY WILL MATCH NEXT TIME
fi
Réponse acceptée :
Vous pouvez utiliser Anacron pour cela, il est conçu pour exécuter des travaux à certains intervalles sans supposer que le système est allumé en permanence. Si une tâche est censée être exécutée tous les mois, Anacron vérifiera si elle a été exécutée le mois précédent et l'exécutera si ce n'est pas le cas (et rappelez-vous qu'il n'a pas besoin de l'exécuter à nouveau pendant un autre mois).
Dans les dérivés de Debian, Anacron fonctionne bien avec Cron pour s'occuper de /etc/cron.{daily,weekly,monthly}
de manière appropriée (vous définissez simplement votre tâche mensuelle comme un travail mensuel dans /etc/cron.monthly
, et il sera exécuté correctement).
Sur d'autres systèmes, vous définiriez votre tâche mensuelle dans /etc/anacrontab
.