Как делегировать в crontab использовать другой файл в качестве crontab? он же Crontab в SVN / CVS? - PullRequest
3 голосов
/ 05 февраля 2009

Может быть, есть другое решение этой проблемы. Я создал веб-приложение, которое требует 5-10 крон, чтобы поддерживать его, и с различными интервалами. Я хочу включить crontab в систему управления версиями, чтобы ее можно было легко развернуть на другие серверы.

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 05 февраля 2009

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

1 голос
/ 26 февраля 2009

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

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

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

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

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

0 голосов
/ 26 февраля 2009

Для этого я помещаю свой файл crontab в систему управления версиями, а затем в своем сценарии развертывания я заменяю файл crontab тем, что развертывается.

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

crontab filename

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

crontab -u my_web_user filename

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

0 голосов
/ 10 февраля 2009

Просто добавьте одну (или очень небольшую) запись в crontab, и пусть эта запись будет скриптом с контролем версий, который вызывает другие:

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

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

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

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

...