Introduction

Si vous avez déjà configuré un cron job sur un VPS Ubuntu, vous avez peut-être rencontré des problèmes qui vous ont laissé perplexe. Un problème courant se produit lorsque le cron job tente d’exécuter un script sans succès, ce qui entraîne des fichiers de sortie de zéro octet ou des opérations incomplètes. Dans cet article de blog, nous explorons un scénario du monde réel où un script Ruby échoue à sauvegarder une base de données MySQL via un cron job, laissant les utilisateurs se demander pourquoi leur commande fonctionne parfaitement dans la ligne de commande mais pas lorsqu’elle est planifiée.

Comprendre le Problème

Dans le cas discuté, le cron job était configuré pour exécuter un script Ruby qui effectue les tâches suivantes :

  1. Sauvegarde de la Base de Données MySQL : Utilise mysqldump pour sauvegarder la base de données spécifiée dans database.yml.
  2. Compression de Fichiers : Le fichier de sauvegarde est compressé en gzip pour économiser de l’espace.
  3. Transfert de Fichiers : Le fichier compressé est envoyé à un serveur distant via SFTP.

Bien que le script fonctionne bien lorsqu’il est exécuté directement à partir de la ligne de commande, le cron job entraînait la génération d’un fichier vide. Voici une version simplifiée de la commande du cron job qui cause le problème.

PATH=/usr/bin
10 3 * * * ruby /home/deploy/bin/datadump.rb

Pourquoi Cela Se Produit-Il ?

Le cœur du problème réside dans l’environnement dans lequel le cron job s’exécute. Lorsqu’un script ou une commande est exécuté via cron, il s’exécute dans un environnement restreint qui peut ne pas toujours imiter la session de terminal de l’utilisateur. Cela peut entraîner des comportements inattendus, surtout lorsque :

  • Répertoire de Travail : Les cron jobs peuvent ne pas s’exécuter dans le répertoire de travail attendu.
  • Variables d’Environnement : Certaines variables d’environnement peuvent ne pas être disponibles lorsqu’un script s’exécute via cron.

Solution

Étape 1 : Vérifier le Répertoire de Travail

Lorsque votre cron job s’exécute, il ne fonctionne pas dans le contexte de votre environnement utilisateur habituel. Souvent, il peut ne pas avoir le même répertoire personnel ou répertoire de travail. Une façon de s’assurer que votre script se comporte de la même manière est de définir explicitement le répertoire de travail.

Comment Préciser le Répertoire de Travail :

  1. Vous pouvez utiliser la commande cd au début de votre cron job :
10 3 * * * cd /home/deploy/bin && ruby datadump.rb

Étape 2 : Utiliser des Chemins Absolus

Un autre problème peut survenir si votre script génère des fichiers en utilisant des chemins relatifs. L’environnement d’exécution du cron job peut ne pas avoir les autorisations nécessaires pour créer des fichiers dans les répertoires par défaut. Pour résoudre ce problème :

  • Utilisez des chemins absolus pour les opérations de fichiers dans votre script au lieu de chemins relatifs.

Par exemple, modifiez la génération de fichiers :

dump       = "/home/deploy/backups/myapp-#{Time.now.strftime(TIMESTAMP)}.sql.gz"

Étape 3 : Définir les Permissions Correctes

Vérifiez que l’utilisateur exécutant le cron job (dans ce cas, deploy) a les permissions nécessaires pour :

  • Le répertoire de sortie où les fichiers de sauvegarde sont créés.
  • L’accès à d’autres fichiers ou répertoires avec lesquels le script interagit.

Étape 4 : Journaliser les Sorties pour le Débogage

L’utilisation de la journalisation dans vos scripts peut fournir des informations précieuses sur ce qui se passe lorsque cron exécute le job. Assurez-vous de journaliser :

  • Des messages indiquant le début et la fin des tâches.
  • Les erreurs rencontrées pendant l’exécution.

Vous pouvez également rediriger la sortie standard et les erreurs vers un fichier journal dans votre commande cron job :

10 3 * * * ruby /home/deploy/bin/datadump.rb >> /home/deploy/log/cron.log 2>&1

Étape 5 : Variables d’Environnement

Enfin, assurez-vous que toutes les variables d’environnement requises sont définies correctement. Le cron job n’héritera pas de toutes les variables de votre shell, ce qui peut entraîner des échecs dans l’exécution du script.

Conclusion

En vérifiant le répertoire de travail, en utilisant des chemins absolus, en s’assurant que les permissions sont correctes, en journalisant les sorties pour un débogage plus facile et en examinant les variables d’environnement, vous pouvez efficacement résoudre les problèmes liés aux cron jobs non fonctionnels.

Faire face à des problèmes techniques avec les cron jobs peut être frustrant, mais avec un dépannage systématique, vous pouvez rétablir la fiabilité des tâches planifiées sur votre système.