У меня есть запланированный скрипт, который делает ежечасное резервное копирование 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.