Сборка пакетов/Соглашение по стилю RPM-пакетов/Задания Cron

Перейти к: навигация, поиск
8. Задания для планировщика (cron)

Назад

Далее


Задания для планировщика (cron)


Обычный способ давать задания cron'у (с помощью /etc/crontab), имеет некоторые ограничения:

  • Задания запускаются в строго определенное время. К примеру, задание назначеное на полночь никогда не будет выполнено, если пользователь всегда выключает на ночь компьютер.
  • При обновлении пакета, нет простого способы для обновления параметров задания (или восстановления удаленного задания), потому что вся информация хранится в одном файле.

Поэтому разработчики SUSE добавили следующие расширения к пакету cron:

  1. Запуска заданий cron'а на регулярной основе (каждый час, день, неделю или месяц), даже если компьютер работает всего по несколько часов в день.
  2. Каждый пакет может хранить свои задания в отдельных файлах.

Их ипользование и описание: см. далее.


Регулярно выполняемые задания


Некоторые пакеты требуют обязательного регулярного обслуживания, к примеру, очиски кеша, или обновления поисковой базы данных. Для этого 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. Меню рабочего стола
Icon-expand.png Эта статья является незавершенной!
Эта статья нуждается в доработке. Если Вы можете помочь, сделайте это в соответствии с руководством по оформлению.