Comment puis-je tester un nouveau script cron?

14

J'exécute plusieurs distributions Linux différentes (Fedora 11, CentOS 5 et SuSE 10.2) et je rencontre souvent un problème où un nouveau script que je veux exécuter en tant que tâche cron fonctionne correctement lorsqu'il est appelé directement à partir de la ligne de commande, mais échoue lors de l'appel depuis cron en raison de légères variations dans le PATH ou d'autres variables d'environnement requises.

Existe-t-il un moyen de tester l'exécution d'un script individuel comme s'il était exécuté à partir de cron, sans avoir à exécuter l'intégralité de crontab ou utiliser run-parts pour exécuter l'intégralité du répertoire cron.daily / .hourly, etc.? Je suppose que je pourrais éditer temporairement ma crontab pour exécuter le script dans les prochaines minutes, mais je préférerais avoir une solution plus autonome pour ne pas risquer de gâcher la crontab.

gareth_bowles
la source

Réponses:

9

De la recherche google surpath in crontab

root@pingu # cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

Vous voulez essentiellement définir le PATH et ne pas avoir à vous soucier des variations. En outre, le test rapide consiste à exécuter votre script via SSH sur toutes vos boîtes en utilisant les mêmes variables d'environnement.

Jeremy L
la source
Merci, je n'avais pas twigué qu'un crontab est comme un script dans la mesure où vous pouvez déclarer des variables d'environnement dans le crontab.
gareth_bowles
7

Si j'exécute un travail cron planifié individuellement (une ligne distincte dans crontab), je le planifie pour chaque minute ou toutes les deux minutes pendant que je le teste. Une fois testé, je modifierai la ligne crontab pour qu'elle fonctionne sur la fréquence que je désire.

En remarque, si je veux tester que cron lui-même fonctionne correctement et envoyer les résultats par e-mail à la bonne adresse (TRÈS important), j'ajouterai la ligne suivante à mon / etc / crontab:

 * * * * * root ls /doesnotexistfoobar

Exécute toutes les minutes et essaie de faire un lssur un répertoire qui n'existe pas. Devrait envoyer un message d'échec toutes les minutes. Je commente la ligne lorsque je la fais fonctionner.

Revenons à votre question: vous ne voudrez probablement pas modifier le travail cron existant pour qu'il s'exécute souvent, à la fois parce qu'il est possible d'oublier de le changer à nouveau, et parce que l'exécution de votre cron.hourly, cron.daily ou cron. pourrait avoir des effets secondaires, selon ce que vous avez là-dedans. Pour vous assurer que vous exécutez le script dans le même environnement dans lequel il sera lorsqu'il sera appelé depuis cron, je vous recommande de modifier mon astuce "ls" ci-dessus:

Ajoutez une ligne à votre crontab pour exécuter le script directement:

 * * * * * root /etc/cron.hourly/customscript

De cette façon, vous pouvez l'exécuter aussi souvent que nécessaire pour le tester.

Schof
la source
Merci - si je pouvais également voter pour cette réponse, je le ferais!
gareth_bowles
0

Je ne connais pas de solution plus directe, mais vous pouvez créer un utilisateur (par exemple, crontest) avec des privilèges pour votre script, et utiliser la crontab spécifique à l'utilisateur pour l'utilisateur 'crontest' pour tester le (s) script (s) en modifiant pour que le script s'exécute dans les prochaines minutes.

poisson-roi
la source