Разница между использованием crontab и /etc/cron.hourly,daily,weekly

Разница между использованием crontab и /etc/cron.hourly,daily,weekly

У меня есть запланированный скрипт, который делает ежечасное резервное копирование svnsync наших репозиториев Subversion. Я запускал его из записи в корневом crontab без проблем, но решил, что хочу запустить его из /etc/cron.hourly вместо этого для дополнительной видимости (и потому что один из наших инженеров случайно удалил crontab, потому что он думал, что "crontab -r" означает "прочитать crontab ;-))

Все команды svnsync в скрипте cron.hourly завершаются сбоем и выводится сообщение о том, что необходимо принять SSL-сертификат для репозитория SVN (это сообщение вы получаете интерактивно при первом доступе пользователя к репозиторию SVN, но после того, как я принял сертификат, сообщение больше не появляется).

Так что мне кажется, что скрипт выполняется в другой пользовательской среде при запуске из cron.hourly, чем при запуске через root crontab. Может кто-нибудь объяснить разницу?

ОБНОВЛЕНИЕ: Я должен был упомянуть свой дистрибутив, я использую anacron на CentOS 5.1.

ОБНОВЛЕНИЕ 2: Спасибо за предложения на данный момент; я думаю, что это превращается в вопрос Subversion. Я всегда пытаюсь инкапсулировать свою среду в свои скрипты, но проблема здесь в том, что я не уверен, что именно в среде (или чего в ней не хватает) заставляет SVN запрашивать принятие сертификата SSL, когда я запускаю свой скрипт из cron.hourly. Я предполагаю, что это как-то связано со способом выполнения скрипта run-parts.

решение1

Вы хотите использовать опцию '--config-dir', чтобы указать, где найти принятый сертификат (например, ~/.subversion по умолчанию).

Тем не менее, я почти уверен, что вам лучше было бы вызвать svnsync из скрипта hooks/post-commit, так какпредложено в другом месте. Тогда ваше зеркало всегда будет синхронизировано, а не синхронизировано с тем, где был ваш хозяин час назад.

решение2

В системах Debian/Ubuntu cron.daily|weekly|monly запускаются из основного crontab.

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 )

Также имейте в виду, что вы, вероятно, могли бы поместить фрагмент crontab в /etc/cron.d/

Как видите, в этой среде нет ничего особенного. По крайней мере, на Debian/Ubuntu все запускается под учетной записью root.

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

решение3

Обычный системный файл crontab — это файл crontab конкретного пользователя, в котором есть поле имени пользователя, как в /etc/crontab.

Использование скриптов /etc/cron.*(ежечасно, ежедневно, еженедельно, ежемесячно) — более чистый и простой способ (предотвращает распространенные синтаксические ошибки) настройки crontab для rootпользователя, и это обрабатывается с помощью , run-partsкоторый запускает скрипты или программы в каталоге. Все эти правила по-прежнему определены в системном crontab по умолчанию ( /etc/crontab), так что это одно и то же.

Когда задания cron обрабатываются с помощью run-parts, их легче отлаживать, так как можно просто проверить, какие именно скрипты будут запущены (не запуская их пока) с помощью:

sudo run-parts --report --test /etc/cron.daily

решение4

В моей системе RHEL 5.1 переменная окружения PATH устанавливается из /etc/crontab. Все, что находится наверху, — это то, что передается в окружение.

Если вы перезапустите cron, то при первом запуске (если из /etc/crontabили /var/spool/cron/$USER) он сделает запись об этом в /var/log/cron. В противном случае он просто отметит, что cron.hourly запущен

Мой crontab настроен следующим образом:

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

Что вы можете сделать, так это поместить в /etc/cron.hourly что-то вроде следующего:

env > /tmp/cron.env

Затем проверьте файл, когда он появится, и либо измените свой скрипт (если сможете), чтобы правильно настроить среду, либо напишите короткий скрипт-оболочку, который будет вызывать ваш crontab.

Связанный контент