Станислав Лапшанский
Статья является переводом текста Dru Lavigne, опубликованного по адресу: http://www.onlamp.com/pub/a/bsd/2001/11/08/FreeBSD_Basics.html.
Совсем недавно, в статье «Как заставить cron выполнять наши приказания» мы рассмотрели использование демона cron. В сегодняшней статье мы сосредоточим внимание на реальных сценариях обслуживания системы, которые cron запускает ежедневно, еженедельно и ежемесячно.
Вообще говоря, всегда разумно знать какие сценарии запускаются на вашем компьютере, поскольку любой сценарий это палка о двух концах. Их положительная сторона в том, что они могут держать вас курсе состояния «здоровья» операционной системы, а так же выполнять некоторые процедуры для поддержания ее работоспособности.
В вашу FreeBSD встроены автоматически запускающиеся сценарии для выполнения практически всех часто применяющихся рутинных операций администрирования. Вам даже не придется знать как вообще пишутся сценарии. Обратная сторона медали заключается в том, что любой сценарий может быть уязвим перед злоумышленником. Поэтому со сценариями надо поступать так же как и с демонами - использовать только те, которые вам действительно необходимы, отбрасывая все лишнее.
Сценарии, о которых мы будем говорить, находятся в каталоге /etc/periodic, где они рассортированы по трем подкаталогам, которые соответствуют периодичности их запуска - ежедневно, еженедельно и ежемесячно:
ls -F /etc/periodic
./ monthly/
../ weekly/
daily/
Имена сценариев начинаются с чисел, которые задают порядок их выполнения. Таким образом сценарий, название которого начинается с числа «120» будет выполнен перед сценарием, начинающимся на «300». Все сценарии помечены признаком выполняемого файла, на что указывает символ «*» в выводе команды ls -F:
ls -F /etc/periodic/weekly
./ 320.whatis*
../ 330.catman*
120.clean-kvmdb* 340.noid*
300.uucp* 400.status-pkg*
310.locate* 999.local*
И наконец, каждый из этих сценариев является сценарием оболочки Bourne (в этом можно убедиться посмотрев на первую строчку сценария - #/bin/sh), а это значит, что вы всегда можете протестировать любой из этих сценариев, запустив его в оболочке sh:
Вы, наверное, помните, что демон cron использует системный файл crontab для того, что бы определить, когда сценарии должны быть запущены в каждом каталоге. Вот часть файла crontab, в которой это отражено:
more /etc/crontab
<вырезано>
# do daily/weekly/monthly maintenance
# запустить ежедневное/-недельное/-месячное обслуживание
1 3 * * * root periodic daily
15 4 * * 6 root periodic weekly
30 5 1 * * root periodic monthly
<вырезано>
Таким образом демон cron вызывает программу periodic, для запуска необходимых ежедневных сценариев - каждую ночь в 3:01, для запуска еженедельных - каждую субботу в 4:15 и для ежемесячных - в 5:30 утра в каждый первый день месяца. Программа periodic имеет собственный конфигурационный файл, который называется periodic.conf, в котором указывается какие именно сценарии будут запускаться, а какие в свою очередь должны быть отключены.
Ваша FreeBSD уже имеет установленный по умолчанию конфигурационный файл periodic.conf, давайте посмотрим начало этого файла:
В этом файле ясно сказано, что вы не должны вносить в него никаких изменений. Вам на выбор предлагается два места в которых вы можете хранить свои собственные файлы periodic.conf, значения указанных в них параметров будут переопределять соответствующие значения в файле /etc/defaults/periodic.conf. Если вы попробуете найти эти файлы, вы обнаружите что их нет на диске, поскольку подразумевается что именно вы должны их создать:
more /etc/periodic.conf
/etc/periodic.conf: no such file or directory
more /etc/periodic.conf.local
/etc/periodic.conf.local: no such file or directory
Перед тем как приступить к созданию вашего собственного настроечного файла, следует ознакомиться с тем, что делает каждый сценарий, для того что бы решить - имеется ли необходимость в его запуске или нет.
Давайте посмотрим что делает каждый сценарий, а так же узнаем запускается он по умолчанию или нет. Эта информация содержится в странице руководства, вызываемой командой man periodic.conf. Я свел все эти данные в следующую таблицу:
| Название
сценария | Производимое действие | Запу-
скается
по
умо-
лчанию |
| Ежедневно запускаемые сценарии: |
| 100.clean_disks | Удаляет все файлы по маске | НЕТ |
| 110.clean_tmps | Очищает каталоги временных файлов | НЕТ |
| 120.clean_preserve | Удаляет старые файлы из /var/preserve | ДА |
| 130.clean_msgs | Удаляет старые системные сообщения из каталога /var/msg | ДА |
| 140.clean_rwho | Удаляет старые файлы в каталоге /var/rwho | ДА |
| 150.clean_hoststat | Удаляет старые файлы в каталоге /var/spool/.hoststat | ДА |
| 200.backup_passwd | Делает резервное копирование файлов /etc/master.passwdи /etc/group, а так же сообщает о их изменении со времени последнего резервирования | ДА |
| 210.backup_aliases | Делает резервное копирование файла /etc/mail/aliasesfile, а так же сообщает о его изменении со времени последнего резервирования | ДА |
| 220.backup_distfile | Делает резервное копирование файла /etc/Distfile и показывает его изменения | ДА |
| 300.calendar | Проводит ежедневный запуск calendar -a | НЕТ |
| 310.accounting | Проводит ротацию данных системы аккаунтинга | ДА |
| 320.distfile | Запускает rdist(1) | ДА |
| 330.news | Запускает сценарий /etc/news.expire | ДА |
| 340.uucp | Запускает сценарий /etc/uuclean.daily | ДА |
| 400.status_disks | Запускает df(1) и dump -W | ДА |
| 410.status_uucp | Запускает uustat -a | ДА |
| 420.status_network | Запускает netstat -i | ДА |
| 430.status_rwho | Запускает uptime(1) | ДА |
| 440.status_mailq | Запускает mailq(1) | ДА |
| 450.status_security | Запускает сценарий /etc/security | ДА |
| 460.status_mail_rejects | Выдает статистику по отвергнутым почтовым соединениям, которая хранится в /var/log/maillog | ДА |
| 470.status_named | Выдает статистику о отвергнутых запросах на передачу информации о зонах с DNS серверов | ДА |
| 500.queuerun | Запускает обработку почтовой очереди | ДА |
| 999.local | Выполняет пользовательские сценарии указанные в файле /etc/daily.local | |
| Сценарии для еженедельного выполнения |
| 120.clean_kvmdb | Удаляет старые /var/db/kvm_*.dbфайлы | ДА |
| 300.uucp | Запускает /usr/libexec/uucp/clean.weekly | ДА |
| 310.locate | Запускает /usr/libexec/locate.updatedb | ДА |
| 320.whatis | Запускает /usr/libexec/makewhatis.local | ДА |
| 330.catman | Запускает /usr/libexec/catman.local | НЕТ |
| 340.НЕТid | Обнаруживает файлы с неправильным владельцем и группой-владельцем (так называемые сироты) | НЕТ |
| 400.status_pkg | Используя pkg_version(1) показывает список устаревших программных пакетов | НЕТ |
| 999.local | Выполняет список дополнительных сценариев, указанных в файле /etc/weekly.local | |
| Сценарии для ежемесячного выполнения |
| 200.accounting | Выводит информацию системы пользовательского аккаунтинга, используя команду ac(8) | ДА |
| 999.local | Выполняет список дополнительных сценариев, указанных в файле /etc/monthly.local | |
Итак теперь вы узнали, что сценариев не так уж и много и большинство из них по умолчанию отрабатываются. Давайте станем суперпользователем и скопируем поставляемый во FreeBSD файл /etc/defaults/periodic.conf в /etc/periodic.conf, для последующего редактирования:
su
Password:
cp /etc/defaults/periodic.conf /etc/periodic.conf
Затем я открыл /etc/periodic.conf в моем любимом текстовом редакторе (попробуйте ee /etc/periodic.conf - прим. переводчика) и прошелся по интересующим меня строкам. Давайте начнем со следующего куска:
Итак мы видим, что по умолчанию, результаты выводимые ежедневно выполняющимися сценариями отсылаются по почте пользователю root. Если вы проверите почту пользователя root, то вы обнаружите там письма с темой «hostname daily run output», и, если вы прочитаете одно из таких писем, то его содержимое будет состоять из результатов работы сценариев, которые в таблице помечены знаком «ДА». Вы можете сделать так, что бы эти сообщения отсылались не пользователю root, а любому другому, если поменяете значение параметра daily_output с root на необходимое.
Если требуется, то вы можете указать не имя пользователя, а путь к файлу, в котором будет сохраняться все сообщения от сценариев, обычно этот файл называется /var/log/daily.log. По умолчанию этот файл не существует, поэтому вам потребуется его создать, это можно сделать отдав команду: touch /var/log/daily.log.
Давайте рассмотрим ежедневно выполняемые сценарии. Заметьте, что порядок выполнения сценариев имеет четкую логику: сначала выполняются сценарии удаляющие устаревшие файлы, затем идут сценарии задачей которых является резервное копирование и в самом конце находятся сценарии выполняющие разнообразные полезные программы.
Этот сценарий по умолчанию выключен, однако вы можете его включить, если ваша система испытывает проблемы со свободным дисковым пространством (этот сценарий предназначен для удаления файлов с определенными расширениями - прим. переводчика). Перед тем как включить этот сценарий, сделайте резервное копирование важных файлов, а так же обязательно посмотрите на список удаленных файлов, для того что бы убедиться, что сценарий не удалил что-нибудь важное. Это особенно важно, если вы решили добавить свои расширения в список для удаления.
Следующий сценарий по умолчанию тоже выключен и может быть включен, если у вас мало свободного места (этот сценарий предназначен для очистки каталогов с временными файлами - прим. переводчика).
Перед тем, как включить сценарий clean-tmps, имейте в виду, что в некоторых версиях FreeBSD у него существуют проблемы с безопасностью. Если вы еще не знаете о существовании бюллетеней безопасности FreeBSD (security advisories - SA), то обязательно занесите в «избранное» и время от времени читайте информацию размещенную на http://www.freebsd.org/security/index.html#adv. Подписавшись на один из листов рассылки на этом сайте, вы будете получать бюллетени безопасности о найденных уязвимостях и способах их устранения. Бюллетень безопасности посвященный уязвимости в вышеупомянутом сценарии называется FreeBSD-SA-01:40.fts.v1.1.asc.
Следующий сценарий очищает каталог /var/preserve. Если вы не знаете что хранится в этом каталоге, посмотрите страницу руководства (man hier) и поищите там слово «preserve»:
man hier
/preserve
preserve/ temporary home of files preserved after
an accidental death of an editor; see ex(1)
preserve/ временное хранилище для файлов,
оставшихся после аварийного завершения
текстового редактора. См. man ex
Теперь, когда вы знаете что находится в каталоге preserve, вы можете решить, оставить или нет включенным этот сценарий.
Следующий сценарий удаляет сообщения посланные командой msgs. Если вы не используете эту утилиту, вы можете выключить этот сценарий, поскольку сообщений для удаления все равно нет. Если вы не уверены, используете ли вы эту утилиту или нет, то для того что бы узнать точно, прочитайте man msgs.
# 130.clean-msgs
daily_clean_msgs_enable="YES" # Ежедневно удалять сообщения
daily_clean_msgs_days= # Если не изменялись Х дней
Для того что бы принять решение о необходимости следующего сценария вам так же следует прочитать страницу руководства, на этот раз посвященную rwho. Если ваша машина с FreeBSD не подключена к сети UNIX-станций, то вы можете выключить этот сценарий, поскольку каталог /var/rwho будет всегда пуст.
У вас в системе может быть, а может и не быть файл hoststat. Для того что бы узнать почему, прочитайте следующий текст: http://www.geocrawler.com/archives/3/169/1999/3/0/1437080. У меня этого файла нет, поэтому я выключил этот сценарий:
Теперь у нас на очереди три сценария делающих резервное копирование. Вы наверняка не откажетесь от того что бы система ежедневно осуществляла резервное копирование ваших файлов с паролями и сведениями о группах. Этот сценарий не только резервирует эти файлы, но и дополнительно сообщает о появившихся в них за день изменениях. Вы должны ежедневно просматривать результат работы этого сценария.
# 200.backup-passwd
daily_backup_passwd_enable="YES" # Резервировать passwd & group
Ежедневное резервное копирование ваших почтовых алиасов (псевдонимов) будет хорошей мыслью. Вот сценарий который занимается именно этим.
# 210.backup-aliases
daily_backup_aliases_enable="YES" # Резервировать почтовые алиасы
Если вы не используете программу rdist для поддержки идентичности файлов на разных машинах, то у вас нет файла /etc/Distfile, и, соответственно, вы можете выключить следующий сценарий.
# 220.backup-distfile
daily_backup_distfile_enable="YES" # Резервировать /etc/Distfile
Программа calendar интересна, но по умолчанию не активирована. Если вам нравится программа fortune, и вы любите читать про разные интересные факты, то вероятно вам стоит запускать утилиту calendar.
Для начала надо решить какой именно календарь будет интересен вам и вашим пользователям. Возможные варианты находятся в каталоге /usr/share/calendar (обратите внимание, что есть календарь и для русскоязычных пользователей - прим. переводчика):
cd /usr/share/calendar
ls -F .
./ calendar.holiday
../ calendar.judaic
calendar.all calendar.music
calendar.birthday calendar.russian
calendar.christian calendar.usholiday
calendar.computer calendar.world
calendar.croatian de_DE.ISO_8859-1/
calendar.german hr_HR.ISO_8859-2/
calendar.history ru_SU.KOI8-R/
Это обычные текстовые файлы и вы можете легко их посмотреть и отредактировать их содержимое. Некоторые файлы содержат действительно ерундовые факты:
А в некоторых других файлах сделаны подборки разных сведений:
more calendar.all
<вырезано>
#include <calendar.world>
#include <calendar.german>
#include <calendar.usholiday>
#include <calendar.croatian>
#include <calendar.russian>
<вырезано>
Любой пользователь, знающий о каталоге с календарями может посмотреть какие факты произошли сегодня и завтра, указав в параметре -f название файла с календарем:
calendar -f calendar.birthday
Nov 4 King William III of Orange born, 1650
Nov 5 Roy Rogers born, 1912
Однако по умолчанию, если пользователь не будет находиться в этом каталоге и не укажет полное имя файла желаемого календаря, то он получит следующее сообщение об ошибке:
Для того что бы решить эту проблему, скажите пользователю, что бы он создал у себя в домашнем каталоге подкаталог и скопировал туда необходимый ему календарь:
cd
mkdir .calendar
cp /usr/share/calendar/calendar.world .calendar/calendar
Мне нравится файл calendar.world, так как он включает в себя календари с днями рождения, с музыкальными, компьютерными, историческими и праздничными датами. Поскольку я сохранил его под названием «calendar», то я могу просто писать calendar в командной строке не указывая параметров и не заботясь о том, в каком каталоге я нахожусь:
Теперь давайте вернемся к сценариям. Если вы включите «календарный» сценарий, он будет посылать по почте настроенный вами вывод программы calendar всем пользователям у которых есть в домашнем каталоге файл .calendar. Суперпользователь будет получать такое письмо вне зависимости от наличия у него в каталоге такого файла. Создайте каталог с календарями, станьте суперпользователем и напишите:
calendar -a
Если вы проверите ваш почтовый ящик, то вы обнаружите там сообщение с темой «Day_of_the_Week Calendar». Если ваши пользователи хотят получить такие сообщения ежедневно, включите соответствующий сценарий:
# 300.calendar
daily_calendar_enable="NO" # Выполнить calendar -a
На сегодня все, в следующей части статьи мы закончим обзор «периодических» сценариев.