Инструментарий системного администрирования: Управление временем и событиями

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

Мартин Браун (Martin C. Brown), Внештатный автор и консультант компании MCslp

Мартин Браун – бывший руководитель IT подразделения с опытом работы в области межплатформенной интеграции. Обладая большим опытом разработчика, он создал динамические сайты для множества крупных клиентов, включая HP и Oracle, и на данный момент является техническим директором ресурса Foodware.net. В настоящее время Мартин в качестве внештатного автора и консультанта сотрудничает с корпорацией Microsoft, работает редактором (LAMP Technologies Editor) журнала LinuxWorld, является видным членом группы AnswerSquad.com. Его перу принадлежат книги на совершенно разные темы: от сертификации Microsoft, компьютеры iMac до программирования открытого исходного кода. При всем этом он продолжает плодотворно работать в области программирования для разных платформ и сред. Связаться с Мартином можно посредством его персонального Web-сайта по адресу http://www.mcslp.com.



10.09.2007

Об этой серии.

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

Планирование против управления по времени

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

Классические примеры – ежедневные задачи, такие как резервное копирование, еженедельные и ежемесячные - очистка журналов, создание отчетов - и выполнение множества других команд в широком спектре различных ситуаций.

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

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

Так как все автоматизировано, одним из основных недостатков запланированных операций является то, что, как только что-то пойдет не так или случится что-то непредвиденное, возможности разрешить проблему не будет. Вам также приходится полагаться на милосердие системы и на ее способность выполнять конкретные задачи в определенные моменты времени. Существуют определенные ограничения на то, когда может быть выполнена команда, а обработка непредсказуемых ситуаций по принципу «если X, то Y, иначе Z» требует опыта в написании сценариев и множества проб и ошибок.

Однако планирование может позволить сэкономить значительное количество времени, поэтому стоит исследовать все возможности.


Планирование однократного выполнения

Система хрон (cron - демон ОС Unix) выполняет запланированные команды в определенные моменты времени и предоставляет два способа запуска команд в заданное время. Команда at планирует задачу на однократное выполнение в заданное время. Таблица crontab позволяет запланировать выполнение команды в определенное время, в определенные дни или использовать комбинацию двух вариантов.

Существует два метода использования команды at. Первый – просто набрать at и время (и, возможно, дату), когда следует запустить команду. Например:

$ at 17:20 
echo It's 17:20!
job 1 at Tue Apr 11 17:20:00 2006

После ввода команды at система будет ожидать ввода команд для выполнения в заданный момент времени. Вы можете ввести столько команд, сколько понадобится, они будут выполнены как сценарий оболочки. Для окончания ввода используйте команду «конец файла» (обычно Control-D).

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

Для задания времени можно использовать стандартный формат (как показано в примере ранее), а также ряд других способов представления. Если вы задаете время исполнения, то команда будет запущена при следующем наступлении заданного времени. Например, если сейчас 17:00 и вы задали 17:20, то команда будет выполнена через 20 минут. Если задать 09:00, то команда будет выполнена в 9 утра следующего дня.

Для ряда частных случаев обычно можно использовать альтернативы:

  • midnight -- 12:00 /00:00 (полночь)
  • noon -- 12:00 (полдень)
  • now -- немедленное выполнение

Также можно использовать опции today и tomorrow. Некоторые системы (BSD и Linux®) также могут поддерживать возможность задания времени от текущего момента посредством задания количества минут, часов, дней, недель, месяцев и лет. Например, вы можете запланировать выполнение задачи в текущее время через неделю, указав:

$ at now + 1 week

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


Проверка запланированных заданий

Для получения списка запланированных в настоящее время задач используйте ключ –l:

$ at -l
1       Tue Apr 11 17:20:00 2006
2       Wed Apr 12 09:00:00 2006

Цифра в выводе команды – это идентификатор задания (ID). К сожалению, определить, что будет делать каждая из стандартных команд в этом списке, не представляется возможным.


Удаление запланированных задач

Вы можете удалить запланированные задания, используя ключ команды –r и указав номер, который был сгенерирован для задачи при планировании, или выбрав номер из списка запланированных задач. Например, чтобы в предыдущем примере удалить задачу, запланированную на 09:00 в среду 12 апреля, следует написать:

$ at -r 2

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

$ at -l
1       Tue Apr 11 17:20:00 2006

Планирование регулярного выполнения заданий

Регулярное выполнение реализуется за счет настройки таблицы системы хрон (crontab), которая определяет интервал и последовательность для каждой команды. Формат файла таблицы – одна строка для каждой команды (шесть полей в строке):

minute hour day month dayofweek command

Время задается числами в соответствии со следующими правилами:

  • Minute: 0-59 (минуты)
  • Hour: 0-23 (часы)
  • Day: 1-31 (дни)
  • Month: 1-12 (месяцы)
  • Day: 0-6 (где 0 соответствует воскресенью – дни недели)

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

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

Спецификация 0 23 * * * do-something позволит запускать команду каждый день в 11 часов вечера.

Если Вы зададите несколько значений, то также определите конкретные моменты времени. Например, для выполнения команды каждые 15 минут попробуйте указать:

0,15,30,45 * * * * do-something

Или можно запланировать выполнение команды через каждые шесть часов, но только с понедельника по пятницу, используя:

0 0,6,12,18 * * 1,2,3,4,5 do-something

В Вашей таблице системы хрон может быть столько строк, сколько понадобится, и задание времени выполнения одной и той же команды может присутствовать несколько раз, если планирование одной строкой представляется затруднительным. Например, чтобы запланировать выполнение команды с понедельника по четверг в 6 часов вечера и в обеденное время в пятницу, вам потребуется две строки:

0 18 * * 1,2,3,4 do-something
0 12 * * 5 do-something

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

* * 1 * * do-something

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

0 12 1 * * do-something

Игнорирование определения минут, как минимум, заставит команду запускаться каждую минуту в заданный час (и день).

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


Обработка сложного планирования

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

Последний день месяца

Например, в системе хрон сложно задать запуск команды или сценария в последний день месяца, так как нет простого способа задания такой информации. Вместо этого приходится задавать последний день каждого месяца отдельно. Например, если год не високосный, можно использовать три строки:

59 23 31 1,3,5,7,8,10,12 * do-something
59 23 30 4,6,9,11        * do-something
59 23 28 2               * do-something

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

Решением данной проблемы является использование для проверки даты команды echo вместо системы хрон. Используем команду cal, которая выводит календарь на текущий месяц, и awk, которая определяет, какой день месяца является последним. Следующая команда дает последний день месяца:

$ echo `cal`|awk '{print $NF}'

Эта последовательность выводит календарь командой echo (которая помещает обычный многострочный вывод в одну строку) и подсчитывает количество выводимых чисел; последнее значение и будет последним днем месяца.

Для использования этого способа в таблице системы хрон следует записать:

59 23 * * * [`echo \`cal\`|awk '{print $NF}'` -eq `date +\%d`] 
&& do-something

Квадратные скобки инициируют проверку внутри оболочки, используемой для запуска команды. Также заметим, что система хрон отфильтровывает символ %, поэтому при использовании в таблице системы хрон к нему нужно добавлять escape-символ. В первой части проверки используется прием, продемонстрированный ранее, во второй части с помощью команды date выводится текущий день. Двойной символ && указывает, что команда справа от && будет выполнена только тогда, когда проверка в левой части возвращает значение «истина».

Определенный день в данной неделе

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

  • Неделя 1: с 1-го по 7-е
  • Неделя 2: с 8-го по 14-е
  • Неделя 3: с 15-го по 21-е
  • Неделя 4: 22-го по 28-е

Чтобы проверить, попадает ли текущий день в заданный интервал, например, в четвертую неделю, можно использовать такую проверку:

[ `date +\%e` -gt 21 -a `date +\%e` -lt 29 ]

Последовательность %e используется для возвращения значения дня, где числа меньше 10 предваряются пробелом вместо нуля, чтобы сравнивались числа, а не строки.

Теперь можно совместить эту проверку с определением в таблице системы хрон, которое пытается запустить команду каждую пятницу:

59 23 * * 5 [ `date +\%e` -gt 21 -a `date +\%e` -lt 29 ]
&& do-something

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


Среда запуска задач хрон

Хотя среду системы хрон можно менять при исполнении задания, лучше создать сценарий замены, который определяет переменные среды – такие как PATH – перед запуском необходимой команды.

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

Использование отдельного сценария замены также позволяет воспользоваться расширениями и возможностями другой оболочки, а не только оболочки Bourne, наиболее часто используемой для выполнения задач системы хрон.

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


Приемы журналирования и записи выходной информации

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

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

1 1 * * * do-something >/var/logs/do-something.log

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

1 1 * * * do-something >>/var/logs/do-something.log

Чтобы игнорировать выходную информацию, перенаправляйте ее в специальное устройство /dev/null. Игнорирование стандартного вывода выглядит так:

1 1 * * * do-something >/dev/null

Чтобы игнорировать стандартный вывод и стандартный вывод ошибок, используйте:

1 1 * * * do-something >/dev/null 2>&1

Если вам нужно собирать протоколы с сортировкой по дате, используйте команду date в задании файла протокола, например:

1 1 * * * do-something >/var/logs/something.`date +\%Y\%m\%d`.log

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

При создании временного файла используйте время и идентификатор процесса (ID) для генерирования уникальных имен файлов, как показано ниже:

LOGFILE=/tmp/`datetime +%Y%m%d`.$$.tempfile
do-something >$LOGFILE 2>&1
mailx -s "Results of do-something report" reportees <$LOGFILE
rm -f $LOGFILE

Не забудьте удалить файл после его отправки адресату. В предыдущем примере вместо mail использована команда mailx, чтобы можно было задать тему сообщения.


Заключение

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

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

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

Ресурсы

Научиться

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=254383
ArticleTitle=Инструментарий системного администрирования: Управление временем и событиями
publish-date=09102007