InfoCity
InfoCity - виртуальный город компьютерной документации
Реклама на сайте







Размещение сквозной ссылки

 

Введение в автоматизацию. Часть 1

Станислав Лапшанский

Статья является переводом текста 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:

cd /etc/periodic/daily
sh 430.status-rwho

Local system status:
 8:25AM up 19 days, 21:34, 7 users, load averages: 0.41, 0.38, 0.29

Вы, наверное, помните, что демон 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, давайте посмотрим начало этого файла:

head -20 /etc/defaults/periodic.conf
#!/bin/sh
#
# This is defaults/periodic.conf - a file full 
# of useful variables that you can set to change 
# the default behaviour of periodic jobs on your
# system. You should НЕТt edit this file! Put any 
# overrides into one of the $periodic_conf_files 
# instead and you will be able to update these defaults
# later without spamming your local configuration 
# information.
#
# Это установленный по умолчанию periodic.conf - файл, заполненный
# полезными переменными, значения которых вы можете менять для того
# что бы изменить поведение периодически выполняемых заданий в вашей
# системе.
# Вы не должны менять этот файл. Поместите любые измененные значения
# переменных в любой из файлов указанных в переменной $periodic_conf_files
# для того что бы при обновлении этого файла ваши настройки не были утеряны.
#
# The $periodic_conf_files files should only contain 
# values which override values set in this file. This 
# eases the upgrade path when defaults are changed and 
# new features are added.
#
# Файлы названия которых указаны в переменной $periodic_conf_files могут
# содержать только параметры значения которых перекрывают значения
# параметров указанных в этом файле. Это упростит обновление системы, когда
# при добавлении новых функций файл установок по умолчанию будет изменен.
#
# $FreeBSD: src/etc/defaults/periodic.conf,v 1.7.2.8 
# 2001/07/28 11:44:22 brian Exp $
#
# What files override these defaults ?
# Какие файлы переписывают значения по умолчанию?
periodic_conf_files="/etc/periodic.conf /etc/periodic.conf.local"
# periodic script dirs
local_periodic="/usr/local/etc/periodic /usr/X11R6/etc/periodic"

В этом файле ясно сказано, что вы не должны вносить в него никаких изменений. Вам на выбор предлагается два места в которых вы можете хранить свои собственные файлы 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 - прим. переводчика) и прошелся по интересующим меня строкам. Давайте начнем со следующего куска:

# Daily options
# These options are used by periodic(8) itself to 
# determine what to do with the output of the sub-programs
# that are run, and where to send that output. $daily_output
# might be set to /var/log/daily.log if you wish to log the 
# daily output and have the files rotated by newsyslog(8)
# Эти параметры используются программой periodic для того что бы
# задать, что делать с выводом запускаемых сценариев и куда
# его отсылать. Переменная $daily_output может быть установлена в
# "/var/log/daily.log", если вы хотите журналлировать ежедневный вывод
# и иметь возможность его ротации при помощи newsyslog(8).
daily_output="root" # user or /file
daily_show_success="YES" # scripts returning 0
daily_show_info="YES" # scripts returning 1
daily_show_badconfig="NO" # scripts returning 2

Итак мы видим, что по умолчанию, результаты выводимые ежедневно выполняющимися сценариями отсылаются по почте пользователю root. Если вы проверите почту пользователя root, то вы обнаружите там письма с темой «hostname daily run output», и, если вы прочитаете одно из таких писем, то его содержимое будет состоять из результатов работы сценариев, которые в таблице помечены знаком «ДА». Вы можете сделать так, что бы эти сообщения отсылались не пользователю root, а любому другому, если поменяете значение параметра daily_output с root на необходимое.

Если требуется, то вы можете указать не имя пользователя, а путь к файлу, в котором будет сохраняться все сообщения от сценариев, обычно этот файл называется /var/log/daily.log. По умолчанию этот файл не существует, поэтому вам потребуется его создать, это можно сделать отдав команду: touch /var/log/daily.log.

Давайте рассмотрим ежедневно выполняемые сценарии. Заметьте, что порядок выполнения сценариев имеет четкую логику: сначала выполняются сценарии удаляющие устаревшие файлы, затем идут сценарии задачей которых является резервное копирование и в самом конце находятся сценарии выполняющие разнообразные полезные программы.

# 100.clean-disks
daily_clean_disks_enable="NO" # Ежедневно удалять файлы
daily_clean_disks_files="[#,]* .#* a.out *.core *.CKP .emacs_[0-9]*"
daily_clean_disks_days=3 # Если они старше Х дней
daily_clean_disks_verbose="YES" # Выдавать список удаленных файлов

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

Следующий сценарий по умолчанию тоже выключен и может быть включен, если у вас мало свободного места (этот сценарий предназначен для очистки каталогов с временными файлами - прим. переводчика).

# 110.clean-tmps
daily_clean_tmps_enable="NO" # Ежедневно удалять временные файлы
daily_clean_tmps_dirs="/tmp" # В этом каталоге
daily_clean_tmps_days="3" # Если к ним не обращались более Х дней
daily_clean_tmps_ignore=".X*-lock quota.user quota.group" # Такие файлы не удалять
daily_clean_tmps_verbose="YES" # Показать список удаленных файлов

Перед тем, как включить сценарий 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, вы можете решить, оставить или нет включенным этот сценарий.

# 120.clean-preserve
daily_clean_preserve_enable="YES" # Удалять файлы ежедневно
daily_clean_preserve_days=7 # Если они не изменялись Х дней
daily_clean_preserve_verbose="YES" # Показать список удаленных файлов

Следующий сценарий удаляет сообщения посланные командой msgs. Если вы не используете эту утилиту, вы можете выключить этот сценарий, поскольку сообщений для удаления все равно нет. Если вы не уверены, используете ли вы эту утилиту или нет, то для того что бы узнать точно, прочитайте man msgs.

# 130.clean-msgs
daily_clean_msgs_enable="YES" # Ежедневно удалять сообщения
daily_clean_msgs_days= # Если не изменялись Х дней

Для того что бы принять решение о необходимости следующего сценария вам так же следует прочитать страницу руководства, на этот раз посвященную rwho. Если ваша машина с FreeBSD не подключена к сети UNIX-станций, то вы можете выключить этот сценарий, поскольку каталог /var/rwho будет всегда пуст.

# 140.clean-rwho
daily_clean_rwho_enable="YES" # Ежедневно удалять файлы rwho
daily_clean_rwho_days=7 # Если они не изменялись Х дней
daily_clean_rwho_verbose="YES" # Показать список удаленных файлов

У вас в системе может быть, а может и не быть файл hoststat. Для того что бы узнать почему, прочитайте следующий текст: http://www.geocrawler.com/archives/3/169/1999/3/0/1437080. У меня этого файла нет, поэтому я выключил этот сценарий:

# 150.clean-hoststat
daily_clean_hoststat_enable="YES" # Ежедневно стирать файл .hoststat
daily_clean_hoststat_days=3 # Если он не изменялся Х дней
daily_clean_hoststat_verbose="YES" # Выдать список удаленных файлов

Теперь у нас на очереди три сценария делающих резервное копирование. Вы наверняка не откажетесь от того что бы система ежедневно осуществляла резервное копирование ваших файлов с паролями и сведениями о группах. Этот сценарий не только резервирует эти файлы, но и дополнительно сообщает о появившихся в них за день изменениях. Вы должны ежедневно просматривать результат работы этого сценария.

# 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.computer
<вырезано>
01/01 AT&T officially divests its local Bell companies, 1984
01/01 The Epoch (Time 0 for UNIX systems, Midnight GMT, 1970)
01/03 Apple Computer founded, 1977
01/08 American Telephone and Telegraph loses antitrust case, 1982
01/08 Herman Hollerith patents first data processing computer, 1889
01/08 Justice Dept. drops IBM suit, 1982
01/10 First CDC 1604 delivered to Navy, 1960
01/16 Set uid bit patent issued, to Dennis Ritchie, 1979
01/17 Justice Dept. begins IBM anti-trust suit, 1969 (drops it, 01/08/82)
01/24 DG Nova introduced, 1969
<вырезано>

А в некоторых других файлах сделаны подборки разных сведений:

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
calendar -f calendar.birthday
calendar: no calendar file: ''calendar.birthday'' or ''~/.calendar/calendar.birthday

Для того что бы решить эту проблему, скажите пользователю, что бы он создал у себя в домашнем каталоге подкаталог и скопировал туда необходимый ему календарь:

cd
mkdir .calendar
cp /usr/share/calendar/calendar.world .calendar/calendar

Мне нравится файл calendar.world, так как он включает в себя календари с днями рождения, с музыкальными, компьютерными, историческими и праздничными датами. Поскольку я сохранил его под названием «calendar», то я могу просто писать calendar в командной строке не указывая параметров и не заботясь о том, в каком каталоге я нахожусь:

calendar
Nov 4 King William III of Orange born, 1650
Nov 5 Roy Rogers born, 1912
Nov 4 UNIVAC I program predicts Eisenhower victory based on 7% of votes, 1952
Nov 4 Iranian militants seize US embassy personnel in Teheran, 1979
Nov 4 Soviet forces crush the anti-communist revolt in Hungary, 1956
Nov 5 Guy Fawkes' Plot, 1605
Nov 4 Flag Day in Panama
Nov 4 Will Rogers Day

Теперь давайте вернемся к сценариям. Если вы включите «календарный» сценарий, он будет посылать по почте настроенный вами вывод программы calendar всем пользователям у которых есть в домашнем каталоге файл .calendar. Суперпользователь будет получать такое письмо вне зависимости от наличия у него в каталоге такого файла. Создайте каталог с календарями, станьте суперпользователем и напишите:

calendar -a

Если вы проверите ваш почтовый ящик, то вы обнаружите там сообщение с темой «Day_of_the_Week Calendar». Если ваши пользователи хотят получить такие сообщения ежедневно, включите соответствующий сценарий:

# 300.calendar
daily_calendar_enable="NO" # Выполнить calendar -a

На сегодня все, в следующей части статьи мы закончим обзор «периодических» сценариев.


Реклама на InfoCity

Яндекс цитирования



Финансы: форекс для тебя








1999-2009 © InfoCity.kiev.ua