Comment exécuter une tâche cron une seule fois à un moment spécifique ?

Publié 17 octobre 2024

Problème : Exécuter une tâche cron une seule fois à un moment spécifique

Les tâches cron sont généralement configurées pour s'exécuter de manière répétée à des horaires programmés. Cependant, il est parfois nécessaire d'exécuter une tâche une seule fois à un moment précis. Cela peut être délicat lors de la configuration de cron pour effectuer une tâche unique et ponctuelle sans la répéter.

Solutions pour exécuter des tâches cron une seule fois à un moment précis

Utilisation de la commande 'at' pour une planification ponctuelle

La commande 'at' permet de planifier des tâches ponctuelles. Vous pouvez définir un moment futur pour l'exécution d'une commande. La syntaxe est la suivante :

echo "/chemin/vers/commande options" | at [heure]

Pour exécuter une commande demain :

echo "/usr/bin/ma_commande" | at now + 1 day

Conseil: Vérifier les tâches planifiées

Utilisez la commande 'atq' pour lister toutes les tâches planifiées. Cela vous aide à confirmer que votre tâche a été correctement programmée et à voir son numéro de file d'attente pour d'éventuelles modifications ou suppressions.

Tâche cron avec script d'auto-désactivation

Si 'at' n'est pas disponible, créez un script d'auto-désactivation :

  1. Configurez une tâche cron avec une heure spécifique :

    0 0 2 12 * /chemin/vers/votre_script.sh
  2. Créez un script qui ne s'exécute qu'une seule fois :

    #!/bin/bash
    
    SCRIPT="/chemin/vers/votre_script.sh"
    MARQUEUR="${SCRIPT}.done"
    
    if [ -f "$MARQUEUR" ]; then
     exit 0
    fi
    
    # Votre tâche ponctuelle ici
    echo "Tâche exécutée" | mail -s "Tâche ponctuelle terminée" utilisateur@exemple.com
    
    touch "$MARQUEUR"

Ce script vérifie l'existence d'un fichier marqueur et s'arrête s'il existe, empêchant ainsi les exécutions multiples.

Utilisation de cron avec vérification de la date

Une autre méthode consiste à vérifier la date :

#!/bin/bash

DATE_EXECUTION="2023-12-25"
DATE_ACTUELLE=$(date +%Y-%m-%d)

if [ "$DATE_ACTUELLE" != "$DATE_EXECUTION" ]; then
  exit 0
fi

# Votre tâche ponctuelle ici
echo "Tâche de vacances exécutée" | mail -s "Tâche de vacances terminée" utilisateur@exemple.com

Ce script n'exécute la tâche qu'à la date définie, sortant si la date actuelle ne correspond pas.

Exemple: Ajout de journalisation aux tâches cron basées sur la date

#!/bin/bash

DATE_EXECUTION="2023-12-25"
DATE_ACTUELLE=$(date +%Y-%m-%d)
FICHIER_LOG="/var/log/tache_ponctuelle_cron.log"

if [ "$DATE_ACTUELLE" != "$DATE_EXECUTION" ]; then
  echo "$(date): Script vérifié, mais non exécuté (mauvaise date)" >> "$FICHIER_LOG"
  exit 0
fi

# Votre tâche ponctuelle ici
echo "Tâche de vacances exécutée" | mail -s "Tâche de vacances terminée" utilisateur@exemple.com

echo "$(date): Tâche exécutée avec succès" >> "$FICHIER_LOG"

Cet exemple ajoute une journalisation pour suivre les tentatives d'exécution du script et les réussites, ce qui est utile pour surveiller et dépanner les tâches cron ponctuelles.