Différence entre l'utilisation de crontab et /etc/cron.hourly,daily,weekly

12

J'ai un script planifié qui effectue une sauvegarde svnsync toutes les heures de nos référentiels Subversion. Je l'exécutais à partir d'une entrée dans la racine crontab sans problème, mais j'ai décidé de l'exécuter à partir de /etc/cron.hourly à la place pour plus de visibilité (et parce qu'un de nos ingénieurs a accidentellement supprimé la crontab parce qu'il pensait "crontab -r "signifiait" lire la crontab ;-))

Les commandes svnsync dans le script cron.hourly échouent toutes avec un message indiquant que le certificat SSL pour le référentiel SVN doit être accepté (c'est le message que vous obtenez de manière interactive la première fois que l'utilisateur accède au référentiel SVN, mais une fois le certificat I accepté le message ne revient pas).

Il me semble donc que le script est exécuté dans un environnement utilisateur différent lorsqu'il est exécuté à partir de cron.hourly que lorsqu'il est exécuté via la racine crontab. Quelqu'un peut-il expliquer la différence?

MISE À JOUR: J'aurais dû mentionner ma distribution, j'utilise anacron sur CentOS 5.1.

MISE À JOUR 2: Merci pour les suggestions jusqu'à présent; Je pense que cela devient plus une question de Subversion. J'essaie toujours d'encapsuler mon environnement dans mes scripts, mais le problème ici est que je ne suis pas sûr de savoir dans quel environnement (ou s'il manque) l'environnement qui fait que SVN demande que le certificat SSL soit accepté lorsque j'exécute mon script à partir de cron.hourly. Je suppose que c'est quelque chose à voir avec la façon dont le script run-parts est exécuté.

gareth_bowles
la source
1
Il serait utile d'inclure votre package de distribution et cron de choix.
Dan Carley

Réponses:

4

Vous voulez utiliser l'option '--config-dir' pour lui faire savoir où trouver le certificat accepté (par exemple ~ / .subversion par défaut).

Cela dit, je suis presque certain que vous feriez mieux d'appeler svnsync à partir du script hooks / post-commit à la place, comme suggéré ailleurs . Ensuite, votre miroir est toujours synchronisé, plutôt que synchronisé avec celui de votre maître il y a une heure.

James Cape
la source
16

Sur le système Debian / Ubuntu, cron.daily | hebdomadaire | mensuel est démarré depuis la crontab principale.

17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

Gardez également à l'esprit que vous pourriez probablement placer un fragment crontab dans /etc/cron.d/

Comme vous pouvez le voir, cet environnement n'a rien de particulièrement spécial. Au moins sur Debian / Ubuntu, tout est exécuté en tant que compte root.

Lorsque j'écris des scripts cron au tout début du script, je définis toujours mon PATH et les autres variables d'environnement que j'utiliserai, donc je peux être certain qu'il fonctionnera correctement dans n'importe quel environnement.

Zoredache
la source
6

Une crontab régulière à l'échelle du système est la crontab d'un utilisateur spécifique et elle a le champ de nom d'utilisateur, tel qu'utilisé par /etc/crontab.

L'utilisation de scripts /etc/cron.*(horaires, quotidiens, hebdomadaires, mensuels) est un moyen plus propre et plus simple (empêche les erreurs de syntaxe courantes) de configurer crontab pour l' rootutilisateur et cela est géré par run-partslequel exécuter des scripts ou des programmes dans un répertoire. Toutes ces règles sont toujours définies dans crontab à l'échelle du système par défaut ( /etc/crontab), c'est donc la même chose.

Lorsque les tâches cron sont gérées par run-parts, sont plus faciles à déboguer, car vous pouvez simplement tester quels scripts seraient exécutés exactement (sans les exécuter pour le moment) en:

sudo run-parts --report --test /etc/cron.daily
Kenorb
la source
3

Ma première supposition serait de vérifier votre variable HOME.

Sur mon système Centos, l'homme 5 crontab dit:

Plusieurs variables d'environnement sont configurées automatiquement par le démon cron (8). SHELL est défini sur / bin / sh, et LOGNAME et HOME sont définis à partir de la ligne / etc / passwd du propriétaire de la crontab.

Donc, si vous n'avez pas spécifié le contraire, la crontab de root utiliserait / root pour HOME. Mais dans / etc / crontab (qui est l'endroit à partir duquel /etc/cron.hourly est exécuté, via run-parts), HOME est défini sur / (et SHELL sur / bin / bash au lieu de / bin / sh).

Je ne connais pas svnsync, mais subversion utilise un répertoire ˜ / .subversion /, ce qui pourrait dépendre de HOME.

Marie Fischer
la source
3

Sur mon système RHEL 5.1, la variable d'environnement PATH est définie à partir de / etc / crontab. Tout ce qui se trouve au sommet, c'est ce qui alimente l'environnement.

Si vous redémarrez cron, la première fois qu'il s'exécutera (si à partir de /etc/crontabou /var/spool/cron/$USER), il en prendra note dans / var / log / cron. Sinon, il suffit de noter que cron.hourly a fonctionné

Mon crontab est défini comme suit:

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

Ce que vous pourriez faire est de mettre quelque chose comme ceci dans /etc/cron.hourly:

env > /tmp/cron.env

Inspectez ensuite le fichier lorsqu'il se présente et modifiez votre script (si vous le pouvez) pour définir l'environnement correctement, ou écrivez un court script d'encapsulage que votre crontab appellera.

Kevin M
la source
2

/var/log/messages (ou l'équivalent de votre distribution) devrait vous dire les détails de quelle commande a été exécutée quand et en tant qu'utilisateur.

Dan Carley
la source
2

Ne présumez jamais qu'il y a quoi que ce soit dans l'environnement. Codez toujours de manière défensive. Vous avez un fichier complet pour y mettre ce que vous voulez dans l'environnement. Utilise le.

Rory
la source
2

Pas beaucoup d'autre portabilité, la dernière fois que j'ai vérifié (dans Debian), il était recommandé de mettre des trucs dans cron.hourly (et les autres) et pas directement dans crontab si vous vouliez créer un paquet avec vos trucs.

Johan
la source