В данном практическом примере происходит изменение файлов crontab в ходе установки пакета.
В практическом примере применяются следующие методы:
Использование классов и сценариев действий над классами
Для получения дополнительной информации см. раздел Создание сценариев действий над классами.
Использование команды crontab в сценарии действия над классом.
Наиболее эффективным способом изменить несколько файлов в ходе установки является определение класса и создание сценария действия над классом. При использовании подхода с классом build необходимо поставлять один сценарий класса build для каждого изменяемого файла crontab. Более общим подходом будет создание класса cron. Для изменения файлов crontab при этом подходе необходимо:
Определить файлы crontab, которые будут изменяться, в файле prototype.
Создайте запись в файле prototype для каждого файла crontab, который будет изменен. Для каждого файла определите класс как cron и тип файла как e. Используйте действительное имя изменяемого файла.
Создать для пакета файлы crontab.
В этих файлах содержится информация, которую необходимо добавить к одноименным существующим файлам crontab.
Создать установочный сценарий действия над классом для класса cron.
Приведенный в примере сценарий класса i.cron делает следующее:
Определяет идентификатор пользователя (UID).
Сценарий i.cron устанавливает значение переменной user равной базовому имени выполняемого сценария класса cron. Это имя и является идентификатором пользователя (UID). Например, базовым именем /var/spool/cron/crontabs/root является root, который одновременно представляет собой UID.
Выполняет команду crontab с использованием UID и параметра -l.
Использование параметра -l означает для команды crontab, что следует направить содержимое файла crontab для определенного пользователя на стандартный вывод.
Передает результаты выполнения команды crontab в сценарий sed, который удаляет все предыдущие записи, добавленные с помощью данного метода установки.
Помещает измененное содержимое во временный файл.
Добавляет файл данных для корневого UID (поставленного с пакетом) во временный файл и добавляет метку о происходжении записей.
Выполняет команду crontabс тем же UID и передает результаты во временный файл в качестве входных данных.
Создать удаляющий сценарий действия над классом для класса cron.
Сценарий r.cron похож на установочный сценарий, за исключением отсутствия процедуры добавления данных в файл crontab.
Эти процедуры выполняются для каждого файла в классе cron.
Сценарии i.cron и r.cron, приведенные ниже, выполняются суперпользователем. Изменение суперпользователем файла crontab другого пользователя может привести к непредсказуемым результатам. При необходимости измените следующую запись в каждом сценарии:
crontab $user < /tmp/$$crontab ||
на
su $user -c "crontab /tmp/$$crontab" ||
PKG=case7 NAME=Case Study #7 CATEGORY=application BASEDIR=/opt ARCH=SPARC VERSION=Version 1.0 CLASSES=cron |
i pkginfo i i.cron i r.cron e cron /var/spool/cron/crontabs/root ? ? ? e cron /var/spool/cron/crontabs/sys ? ? ? |
# PKGINST parameter provided by installation service while read src dest do user=`basename $dest` || exit 2 (crontab -l $user | sed -e "/#$PKGINST$/d" > /tmp/$$crontab) || exit 2 sed -e "s/$/#$PKGINST/" $src >> /tmp/$$crontab || exit 2 crontab $user < /tmp/$$crontab || exit 2 rm -f /tmp/$$crontab done exit 0 |
# PKGINST parameter provided by installation service while read path do user=`basename $path` || exit 2 (crontab -l $user | sed -e "/#$PKGINST$/d" > /tmp/$$crontab) || exit 2 crontab $user < /tmp/$$crontab || exit 2 rm -f /tmp/$$crontab done exit |
41,1,21 * * * * /usr/lib/uucp/uudemon.hour > /dev/null 45 23 * * * ulimit 5000; /usr/bin/su uucp -c "/usr/lib/uucp/uudemon.cleanup" > /dev/null 2>&1 11,31,51 * * * * /usr/lib/uucp/uudemon.poll > /dev/null |
0 * * * 0-6 /usr/lib/sa/sa1 20,40 8-17 * * 1-5 /usr/lib/sa/sa1 5 18 * * 1-5 /usr/lib/sa/sa2 -s 8:00 -e 18:01 -i 1200 -A |
Если при изменении группы файлов общий размер файлов увеличится более чем на 10 КБ, создайте файл space для того, чтобы команда pkgadd приняла во внимание это увеличение. Для получения дополнительной информации о файле space см. раздел Резервирование дополнительного места на диске на целевой системе.