2009-02-05 5 views
3

Возможно, это другое решение. Я создал веб-приложение, которое требует 5-10 клонов, чтобы поддерживать его и различные интервалы. Я хочу зарегистрировать crontab в контроле версий, чтобы его можно было легко развернуть другим серверам.Как делегировать внутри crontab использовать другой файл в качестве crontab? aka Crontab в SVN/CVS?

Я хотел бы иметь возможность поставить строку в/и т.д./файле кронтаб что бы сказать ему, чтобы посмотреть в /myapp/app.crontab файл и обработать все линии в этом файле как запись кронтаба .. т.е.:

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

Почему бы не просто проверить/etc/crontab? Поскольку при развертывании с сервера на сервер некоторые серверы могут иметь разные записи в своих crontabs, с которыми я не хочу вмешиваться.

Любые идеи? Что делают другие люди для хранения кучи записей crontab в rev ctrl?
Спасибо.

ответ

4

Поместите свой файл crontab в файл /etc/cron.d/ - либо в качестве извлеченного файла, либо символическую ссылку на извлеченный файл.

+0

Если вы указали символическую ссылку, вы должны быть уверены, что целевой файл имеет правильные разрешения, а изменения файла могут не заметить cron. http://askubuntu.com/questions/54857/can-symlinks-be-used-in-etc-cron-d –

+0

@CollinAnderson Как я могу убедиться, что целевой файл имеет правильные разрешения и что изменения файла замечены? – CMCDragonkai

0

Просто добавьте один (или очень мало) записей в CRONTAB, и есть, что запись будет пересмотр контролируемых сценарий, который вызывает другие:

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

hourly.sh затем будет называть все, что нужно делать час, ежедневно .sh тогда будет называть все, что нужно делать ежедневно, и т. д.

Я нашел при управлении большим количеством заданий cron для одного приложения, что лучше не у вас есть все вакансии, зависящие от crontab, потому что это побуждает вас игнорировать зависимости между ними, то есть одна задача, которая выполняется за 14 минут после часа, зависит от задачи, которая проходит через 12 минут после часа, но все так часто для выполнения этой задачи требуется 2,1 минуты, а другой скрипт терпит неудачу, предоставив вам Heisenbug.

Другой подход - написать собственный демон для управления этими задачами.

0

То, как я это делаю, это поставить файл crontab в исходный элемент управления, а затем в моем сценарии развертывания я заменяю файл crontab тем, что развертывается.

Вы можете сделать это так:

crontab filename

Или для конкретного пользователя (должен иметь доступ суперпользователя для этого):

crontab -u my_web_user filename

Один большой нюанс с этим заключается в том, что он предполагает наличие только одной записи crontab для каждого пользователя и что она хранится в SCM. Если кто-то другой отредактирует crontab на сервере, эти изменения будут потеряны при следующем развертывании. Поэтому имейте это в виду.

1

Мы используем совсем другой подход к этой проблеме в проекте, над которым я работаю.

У нас есть сценарий Perl под названием crontab.pl, который все серверы называют своим crontab. Выполнение этого способа означает, что crontab никогда не должен меняться при последовательных развертываниях приложений, а сценарий crontab.pl может с радостью жить в исходном управлении с остальными исходными файлами приложения.

Мы можем указать разные временные интервалы для этого скрипта с параметром командной строки. Кронтаб выглядит следующим образом:

*/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 

Тогда это просто вопрос чтения в этой командной строки интервала времени и запуска задач, необходимых для данного интервала.