GNU/Linux >> Tutoriels Linux >  >> Linux

Meilleur moyen de s'assurer qu'un script est exécuté une fois par période ?

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 .


Linux
  1. La meilleure façon de détecter (à partir d'un script) si un logiciel est installé ?

  2. Comment exécuter un script ? ?

  3. Compiler un script PHP sous Linux

  4. Quelle est la meilleure façon de s'assurer qu'une seule instance d'un script Bash est en cours d'exécution ?

  5. Exécuter le script bash après la connexion

Comment exécuter un script Python en PHP

Comment exécuter un script bash

Script au démarrage ?

Meilleur moyen de scripter des commandes SSH distantes dans Batch (Windows)

Quel est le moyen le plus rapide d'exécuter un script ?

Quelle est la meilleure façon de vérifier si un volume est monté dans un script Bash ?