2009-02-05 8 views
3

Peut-être theres une autre solution à cela. J'ai construit une application web qui nécessite 5-10 crons pour le maintenir et divers intervalles. Je veux enregistrer le crontab dans le contrôle de version, afin qu'il puisse être facilement déployé vers d'autres serveurs.Comment déléguer dans un crontab pour utiliser un autre fichier comme crontab? aka Crontab dans SVN/CVS?

Je voudrais être en mesure de mettre une ligne dans le fichier/etc/crontab qui raconterait à regarder dans le fichier /myapp/app.crontab et de traiter toutes les lignes dans ce fichier comme entrées crontab .. c'est-à-dire:

0 1 * * * root /bin/sh /do/something.sh 

Pourquoi ne pas simplement vérifier/etc/crontab? Parce que lors du déploiement du serveur au serveur, certains serveurs peuvent avoir différentes entrées dans leurs crontabs que je ne veux pas interférer avec.

Des idées? Que font les autres utilisateurs pour stocker un tas d'entrées crontab dans rev ctrl?
Merci. Placez votre fichier crontab dans /etc/cron.d/ - soit comme un fichier extrait, soit comme un lien symbolique vers le fichier extrait.

Répondre

4

+0

Si vous créez un lien symbolique, vous devez vous assurer que le fichier cible dispose des autorisations appropriées et que les modifications de fichier risquent de ne pas être détectées par cron. http://askubuntu.com/questions/54857/can-symlinks-be-used-in-etc-cron-d –

+0

@CollinAnderson comment je m'assurerais que le fichier cible a les permissions correctes, et que les changements de fichier sont remarqués? – CMCDragonkai

0

Il suffit d'ajouter un (ou très peu) les entrées crontab, et ont cette entrée soit un script contrôlé par la révision qui appelle d'autres:

0 * * * * /path/to/app/hourly.sh 0 0 * * * /path/to/app/daily.sh 0 1 * * 5 /path/to/app/weekly.sh

hourly.sh appelait alors tout ce qui doit être fait heure par jour .sh appelait alors tout ce qui doit être fait quotidiennement, etc.

J'ai trouvé en gérant un grand nombre de travaux de cron pour une seule application qu'il est préférable de ne pas avoir les tâches en suspens dans la crontab, parce que cela vous encourage à négliger les dépendances entre elles, c'est-à-dire qu'une tâche qui fonctionne à 14 minutes après l'heure dépend d'une tâche qui a lieu 12 minutes plus tard, mais de temps en temps cette tâche prend 2.1 minutes pour terminer, et l'autre script échoue, vous donnant un Heisenbug.

Une autre approche consiste à écrire votre propre démon pour gérer ces tâches.

0

La façon dont je fais cela est de mettre mon fichier crontab dans le contrôle de la source, puis dans mon script de déploiement, je remplace le fichier crontab par ce qui est déployé.

Vous pouvez le faire comme ceci:

crontab filename

Ou pour un utilisateur spécifique (doit avoir accès super-utilisateur pour cela):

crontab -u my_web_user filename

Une grande mise en garde cette est qu'il suppose qu'il n'y a qu'une seule entrée crontab par utilisateur et qu'elle est stockée dans SCM. Si quelqu'un d'autre édite le crontab sur le serveur, ces modifications seront perdues lors du prochain déploiement. Alors soyez conscient de cela.

1

Nous adoptons une approche très différente de ce problème pour le projet sur lequel je travaille.

Nous avons un script Perl appelé crontab.pl que tous les serveurs appellent dans leur crontab. En procédant de cette manière, le crontab ne doit jamais changer lors des déploiements d'applications successifs et le script crontab.pl peut vivre heureux dans le contrôle de la source avec le reste des fichiers source de l'application.

Nous pouvons spécifier différents intervalles de temps pour ce script avec un paramètre de ligne de commande. Le crontab ressemble à ceci:

*/5 * * * * /usr/local/apache/crontab.pl 5 > /var/log/crontab.log 2>&1 # 5 minute interval 
1 * * * * /usr/local/apache/crontab.pl 60 > /var/log/crontab.log 2>&1 # 1 hour interval 
1 1 * * * /usr/local/apache/crontab.pl 3600 > /var/log/crontab.log 2>&1 # 1 day interval 

Ensuite, il est juste une question de lecture dans cet intervalle de temps de ligne de commande et l'exécution des tâches nécessaires à l'intervalle donné.

Questions connexes