Сборка пакетов/Соглашение по стилю RPM-пакетов/Задания Cron
| 8. Задания для планировщика (cron) | ||
|---|---|---|
Содержание
Задания для планировщика (cron)
Обычный способ давать задания cron'у (с помощью /etc/crontab), имеет некоторые ограничения:
- Задания запускаются в строго определенное время. К примеру, задание назначеное на полночь никогда не будет выполнено, если пользователь всегда выключает на ночь компьютер.
- При обновлении пакета, нет простого способы для обновления параметров задания (или восстановления удаленного задания), потому что вся информация хранится в одном файле.
Поэтому разработчики SUSE добавили следующие расширения к пакету cron:
- Запуска заданий cron'а на регулярной основе (каждый час, день, неделю или месяц), даже если компьютер работает всего по несколько часов в день.
- Каждый пакет может хранить свои задания в отдельных файлах.
Их ипользование и описание: см. далее.
Регулярно выполняемые задания
Некоторые пакеты требуют обязательного регулярного обслуживания, к примеру, очиски кеша, или обновления поисковой базы данных. Для этого SUSE Linux предоставляет следующие директории:
-
/etc/cron.hourly -
/etc/cron.daily -
/etc/cron.weekly -
/etc/cron.monthly
Как это определено в файле /etc/crontab, планировщик cron выполняет скрипт /usr/lib/cron/run-crons каждые 15 минут. Он просматривает директории /etc/cron.{hourly,daily,weekly,monthly}, и проверяет какие скрипты в них пора выполнить. Информация о последнем запуске скриптов хранится в файле /var/spool/cron/lastrun. Подобная схема дает уверенность, что скрипты выполняются регулярно, которой нет в случает если используются статичные записи cron'а, выполняемые в фиксированное время. Использование фиксированного времени для запуска скриптов см. ниже.
Любой пакет может установить свои скрипты в любую из этих директорий. Обычно скрипты добавляются в пакет с помощью дополнительного тега Source(SourceN). Они устанавливаются в секции %install и затем перечисляются в секции %files.
Пример взят из пакета man, для повышения наглядности используется сразу два скрипта:
Source2: cron.daily.do_mandb
Source3: cron.daily.clean_catman
[...]
%install
mkdir -p ${RPM_BUILD_ROOT}/etc/cron.daily
install -m 700 %{SOURCE2} ${RPM_BUILD_ROOT}\
/etc/cron.daily/do_mandb
install -m 700 %{SOURCE3} ${RPM_BUILD_ROOT}\
/etc/cron.daily/clean_catman
[...]
%files
[...]
/etc/cron.daily/clean_catman
/etc/cron.daily/do_mandb
Нет каких-нибудь особенных ограничений для скриптов cron'а. Однако, они должны выполнить все надлежащие проверки. Иначе, большое количество сообщений о сбоях может зафлудить почту системного администратора. К примеру, скрипт должен проверять наличие программы, перед тем как пытаться ее выполнить. И он должен возвращать “0”, даже если при выполнении произошел сбой, кроме случаев когда это действительно важно.
Пример из пакета wwwoffle:
#!/bin/sh
#
# purge the wwwoffle cache directory according to
# the parameters defined in /etc/wwwoffle/wwwoffle.conf
#
if [ -x /usr/bin/wwwoffle ] ; then
/sbin/checkproc /usr/sbin/wwwoffled && \
/usr/bin/wwwoffle -purge -c /etc/wwwoffle/wwwoffle.conf
exit 0
else
exit 0
fi
Это пример правильной проверки, действие выполняется только если программа существует и выполняется.
Следующий пример более сложный, взят из пакета man:
#!/bin/sh
#
# clean_catman. This script was split off cron.daily
# Please add your local changes to cron.daily.local
# since this file will be overwritten, when updating your system.
#
# Copyright (c) 1996-2002 SuSE GmbH Nuernberg, Germany.
#
# please send bugfixes or comments to feedback@suse.de.
#
# Authors:
# Burchard Steinbuild, feedback to http://www.suse.de/feedback
# Florian La Roche, feedback to http://www.suse.de/feedback
#
# paranoia settings
#
umask 022
PATH=/sbin:/bin:/usr/sbin:/usr/bin
export PATH
if [ -f /etc/sysconfig/cron ] ; then
. /etc/sysconfig/cron
fi
# Delete too old preformatted man-pages.
if test "$DELETE_OLD_CATMAN" = yes ; then
if test -z "$CATMAN_ATIME" ; then
# Default is 7 days
CATMAN_ATIME=7
fi
test -e /var/cache/man -a -x /usr/bin/safe-rm && \
find /var/cache/man -name '*.gz' -type f \
-atime +$CATMAN_ATIME -print0 | \
xargs --no-run-if-empty --max-lines=200 --null -- \
/usr/bin/safe-rm
fi
exit 0
Скрипт начинается с установки параноидальных настроек, они используются для увеличения защищенности скрипта с точки зрения безопасности.
See also the proper use of /etc/sysconfig. The user need not edit the script himself, but he can configure the system setting at one place.
Задания выполняемые в строго определенное время
Некоторые пакеты требуют произвольного итервала для своих заданий, а не только ежечасно, ежедневно, еженедельно или ежемесячно. И для этого SUSE Linux предоставляет директорию /etc/cron.d.
Эта директория не для скриптов, а для конфигурационных файлов наподобие /etc/crontab. Доп. информация в man crontab(5). Cron обрабатывает файлы в этой директории подобно файлу /etc/crontab.
Преимущество такого способа хранения задания, в том что каждый пакет может хранить свои настройки в отдельном файле.
Любой пакет может записать свой конфигурационный файл планировщика в эту директорию. Рекомендуется чтобы имя файла совпадало с именем пакета, оно может содержать символы в верхнем и нижнем регистре, цифры, символы подчерты и тире.
Обычно скрипты добавляются в пакет с помощью дополнительного тега Source(SourceN). Они устанавливаются в секции %install и затем перечисляются в секции %files. Также желательно отметить эти файлы макросом %config, так как пользователь может пожелать изменить их.
Пример взят из пакета awstats:
Source4: cron.d.awstats
[...]
%install
[...]
install -d -m 755 $RPM_BUILD_ROOT/etc/cron.d
install -m 700 %{SOURCE4} $RPM_BUILD_ROOT/etc/cron.d/awstats
[...]
%files
[...]
%config /etc/cron.d/awstats
Конфигурационный файл /etc/cron.d/awstats выглядит примерно так:
#update reports every 6 hour 0 */6 * * * root /usr/sbin/awstats-update
Другое интересное решение используется в пакете mailman. Конфигурационный файл для cron'а включен в архив исходных кодов и устанавливается с помощью make install. Главное отличие здесь в том, что конфигурационный файл по умолчанию не используется. Он устанавливается в /usr/lib/mailman/cron/crontab, а в /etc/init.d копируется при запуске сервиса, при остановке - удаляется. Подобный способ используется потому что задания для cron'а являются частью функциональности сервиса, и не должны выполнятся если сервис не запущен.
Часть скрипта инициализации /etc/init.d/mailman:
ETC_CT=/etc/cron.d/mailman
MM_CT=/usr/lib/mailman/cron/crontab
MM_CTRL=/usr/lib/mailman/bin/mailmanctl
MM_PID=/var/lib/mailman/data/master-qrunner.pid
[...]
case "$1" in
start)
echo -n "Starting mailman"
if ! /sbin/checkproc -k -p $MM_PID /usr/bin/python; then
install -m 0644 $MM_CT $ETC_CT
$MM_CTRL --quiet --stale-lock-cleanup start
else
rc_reset
fi
rc_status -v
;;
stop)
echo -n "Shutting down mailman"
rm -f $ETC_CT
/sbin/killproc -p $MM_PID -TERM /usr/bin/python
rc_status -v
;;
Часть конфигурационного файла предназначенного для копирование в /etc/cron.d:
# # if you want to make changes to this file, please modify # /usr/lib/mailman/cron/crontab and restart mailman # # At 8AM every day, mail reminders to admins as to pending # requests. They are less likely to ignore these reminders if # they're mailed early in the morning, but of course, this is # local time... ;) 0 8 * * * mailman /usr/bin/python -S /usr/lib/mailman/cron/checkdbs # # At 9AM, send notifications to disabled members that are due # to be reminded to re-enable their accounts. 0 9 * * * mailman /usr/bin/python -S /usr/lib/mailman/cron/disabled [...] # At 3:27am every night, regenerate the gzip'd archive file. Only # turn this on if the internal archiver is used and # GZIP_ARCHIVE_TXT_FILES is false in mm_cfg.py 27 3 * * * mailman /usr/bin/python -S /usr/lib/mailman/cron/nightly_gzip [...]
Ссылки
| 7. Скрипты инициализации | 9. Меню рабочего стола |
| Эта статья является незавершенной! Эта статья нуждается в доработке. Если Вы можете помочь, сделайте это в соответствии с руководством по оформлению. |