Содержание


Планирование и автоматизация выполнения заданий средствами командной оболочки shell

Часть 2. Специализированные средства планирования

Comments

Серия контента:

Этот контент является частью # из серии # статей: Планирование и автоматизация выполнения заданий средствами командной оболочки shell

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Планирование и автоматизация выполнения заданий средствами командной оболочки shell

Следите за выходом новых статей этой серии.

1. Введение. Планирование времени выполнения заданий

Приёмы автоматизации и планирования выполнения отдельных заданий, которые описывались в предыдущей статье, пригодны в большей степени для отложенного выполнения разовых операций в течение одного дня. Для настоящего планирования и автоматизированного выполнения серьёзных заданий требуется привлечение специализированных средств – at (batch) и cron.

Команда at позволяет начинать выполнение заданий в заданное время. Она является стандартной в большинстве Unix-систем. Команда batch является "подмножеством" команды at и представляет собой упрощённую подсистему пакетной обработки очередей заданий с выполнением их в периоды наименьшей загрузки системы.

Главная задача сервиса cron – обеспечение планирования периодически выполняющихся заданий.

2. Планирование с помощью at и batch

2.1. Команда at – в нужное время

Основным и обязательным параметром, принимаемым командой at, является время, в которое необходимо выполнить указанное задание (команду или файл скрипта). Обобщённый синтаксис этой команды:

at [ключи] ВРЕМЯ < файл_скрипта

В заданное ВРЕМЯ будут считаны и выполнены все команды из файла_скрипта. Можно обойтись и без файла скрипта, а вводить команды в интерактивном режиме:

at [ключи] ВРЕМЯ
> команда1
> команда2
> ...
> Ctrl+D

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

Ещё одно важное замечание: проследите за тем, чтобы в вашей системе был активизирован демон atd (не все дистрибутивы запускают его по умолчанию) для того, чтобы предоставить запланированным заданиям возможность выполнения. Также обратите внимание на содержимое файлов /etc/at.allow (если этот файл существует, то ваше пользовательское имя должно присутствовать в нём) и /etc/at.deny (этот файл создаётся по умолчанию, но вашего пользовательского имени в нём быть не должно).

2.2. Ключи

Для команды at могут быть заданы следующие ключи:

  • -V – вывод номера версии программы в стандартный поток ошибок (stderr);
  • -m – отправить сообщение электронной почты пользователю о результате выполнения его задания, даже если это задание не сгенерировало никаких выходных данных;
  • -f имя_файла – считывать команды задания из файла с указанным именем;
  • -l – выдать список всех запланированных заданий. Аналог команды atq;
  • -d номер_задания – удаление задания с указанным номером (можно перечислить несколько номеров). Аналог команды atrm.

Это наиболее часто используемые ключи, которых вполне достаточно для эффективного использования at. О ключах с более специфическими функциями (например, -q позволяет управлять различными очередями, а -t позволяет задавать время выполнения в формате команды touch) вы можете прочитать в man-странице at.

2.3. Время

Время в команде at может быть задано столь многими и разнообразными способами, что это предмет отдельного разговора. Самая простая форма ЧЧ:ММ служит для планирования выполнения в указанное время текущего дня. А что, если задано уже прошедшее время? Например, вы в 22:00 отдаёте приказ о выполнении некой операции в 16:00. Это не смутит команду at – она выполнит ваш приказ на следующий день в 4 часа пополудни.

Рассмотрим пример:

$ at 15:38
warning: commands will be executed using /bin/sh
at> df -h > freespace.txt
at> <EOT>
job 1 at 2009-11-26 15:38
$

После ввода команды at с указанием времени выполнения вас предупредят о том, что все команды будут выполнены с помощью интерпретатора /bin/sh (это предупреждение выводится не во всех версиях команды at), после чего будет выведено приглашение at>. Можно вводить команду или несколько команд – после нажатия клавиши Enter выводится очередное приглашение at>. У вас может возникнуть вопрос: почему после команды указано перенаправление вывода в файл? Дело в том, что по умолчанию все результаты выполнения запланированного задания будут отправлены вам по электронной почте. Часто гораздо удобнее организовать вывод в файл на диске.

После ввода всех необходимых команд задания в ответ на очередное приглашение at> нажмите комбинацию клавиш Ctrl+D. Появится метка <EOT>, и будет выведена строка статуса задания с указанием его номера и времени выполнения.

Как уже было сказано ранее, время можно задавать разнообразными способами. Вот примеры допустимого указания времени при вызове команды at:

at 20:00 Nov 30  –  30 ноября в 8 часов вечера
at 5.45am Dec 1  –  1 декабря в 5:45 утра
at 11.15pm       –  в 23:15 сегодня (если это время уже прошло, то завтра)
at now + 1 hour  –  через час
at now + 20 minutes – через двадцать минут
at 7am tomorrow  –  завтра в 7 часов утра
at 3am + 3 days  –  через три дня в 3 часа ночи
at 14:00 + 2 weeks – в 2 часа дня через две недели

2.4. Способы передачи заданий в команду at

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

#!/bin/bash
cd $HOME
if [ ! -d archives ]
then
  mkdir archives
fi
tar cjf my_project.tar.bz2 $HOME/my_project/
mv my_project.tar.bz2 $HOME/archives

Сохраним этот скрипт в файле backup.sh, затем сделаем файл выполняемым:

chmod 755 backup.sh

Теперь можно передать этот файл для выполнения команде at:

$ at 23:30 Nov 27 -f ~/backup.sh
job 2 at 2009-11-27 23:30

Около полуночи 27 ноября можете проверить, создана ли резервная копия вашего проекта в подкаталоге archives.

Отдельные команды можно передавать с помощью конвейера:

echo df -h | at now + 5 minutes

2.5. Управление заданиями

Чтобы просмотреть полный список запланированных заданий, введите команду at -l или atq:

$ atq
1 2009-11-26 15:38 a alex
2 2009-11-27 23:30 a alex
3 2009-11-26 14:22 a alex

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

Задания удаляются с помощью команды at -d или её аналога atrm с обязательным указанием номера задания. Поскольку список заданий чрезвычайно лаконичен, приходится задуматься, прежде чем выбрать именно то задание, которое следует удалить. Первым указано задание по определению свободного места на разделах дисков, вторым – процедура резервного копирования. Следовательно, номер 3 соответствует примеру с конвейером – вот его-то мы сейчас и удалим:

$ atrm 3
$ at -l
1 2009-11-26 15:38 a alex
2 2009-11-27 23:30 a alex

Вот и всё, что вам необходимо для планирования выполнения одиночных заданий.

2.6. Упрощённый вариант – команда batch

Многие считают подсистемы пакетной обработки заданий безнадёжно устаревшими инструментами, так сказать, "пережитками прошлого". Любое мнение имеет право на существование, но в данном случае противники пакетной обработки не совсем правы. Подсистема обработки очереди пакетных заданий batch не позволяет указывать конкретное время выполнения, а сама выбирает время наименьшей загруженности системы и запускает задания в том порядке, в котором они записаны в очереди. Синтаксис команды:

$ batch
at> команда1
at> команда2
at> ...
at> Ctrl+D

Когда загрузка системы снизится до определённого уровня (задаваемого при запуске демона atd), batch начнёт выполнять команды из своей очереди, которая в общем списке обозначается символом b в предпоследнем столбце (см. вывод команды at -l). Удалять задания из списка batch можно точно так же командой atrm или at -d.

3. Cron – мощная система долгосрочного планирования выполнения заданий

Сервис cron является основным системным планировщиком, служащим для регулярного выполнения различных заданий в фоновом режиме. Команда crontab позволяет пользователям создавать, редактировать и удалять инструкции для сервиса cron с использованием специального crontab-файла. У каждого пользователя может быть собственный crontab-файл, но в крупных промышленных системах администраторы-суперпользователи (с правами root) часто исключают эту возможность. В этом случае администратор создаёт вспомогательные файлы /etc/cron.deny и /etc/cron.allow, содержащие списки пользователей, которым соответственно запрещено и разрешено применять команду crontab.

Выполнение всех инструкций из файлов crontab обеспечивает демон crond. Среда выполнения может существенно отличаться от той, в которой проходят обычные сеансы работы пользователя с системой. Поэтому рекомендуется указывать полные путевые имена команд и скриптов и внимательно следить за использованием переменных и функций командной оболочки shell, особенно если они были созданы пользователем для личного употребления.

3.1. Структура файла crontab

Инструкции для выполнения планируемых заданий записываются в файл crontab в строго определённом формате. Каждой инструкции соответствует отдельная запись, содержащая шесть полей:

Номер  Поле         Содержание               Диапазон значений
1      минуты       минуты в пределах часа   0-59
2      часы         время суток              0-23 (0 – означает полночь)
3      дни_месяца   номер дня в месяце       1-31
4      месяц        номер месяца             1-12
5      дни_недели   номер дня недели         0-7 (0 и 7 – воскресенье)
6      команда      планируемая для выполнения команда или скрипт

Все поля записи разделяются между собой пробелами. Общий формат записи выглядит так:

минуты часы дни_месяца месяц дни_недели команда

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

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

Символ "звёздочка" (*) обозначает весь диапазон значений полностью, "от первого до последнего", т.е. каждую минуту, каждый час, каждый день и т.д. Если указан диапазон, то для него можно задать интервал пропуска с помощью символа "слэш" (/). Например, запись диапазона в виде */2 означает "каждый второй". Кроме того, можно указывать списки диапазонов (1-5,25-30).

Если самым первым символом в строке записи является #, то содержимое этой строки рассматривается как комментарий и полностью игнорируется. Это простой способ временно заблокировать запись, не удаляя её.

3.2. Примеры записей в файле crontab

Запись

30 23 * * * /home/alex/bin/backup.sh

означает выполнение скрипта резервного копирования (ещё раз обратите внимание: задано полное путевое имя) ежедневно в 23:30.

Глобальное резервное копирование можно запланировать не так часто:

22 2 1,10,25 * * /home/alex/bin/total_backup.sh

Скрипт total_backup.sh будет запускаться в 2:22 ночи 1-го, 10-го и 25-го числа каждого месяца.

В свободное время можно устроить "чистку":

7 1 * * 6,7 find /home/alex -name "*.bak" -type f -atime +7 -exec rm {} \;

В 1:07 ночью по субботам и воскресеньям будет выполняться команда find с целью удалить все bak-файлы в домашнем каталоге и подкаталогах при условии, что к этим файлам не было обращения на протяжении семи дней.

0,30 16-18,21-23 * * 5 /home/alex/bin/db_check.sh

Каждые полчаса с 16:00 до 18:00 и с 21:00 до 23:00 в пятницу будут выполняться контрольные проверки баз данных в соответствии со скриптом db_check.sh.

3.3. Использование команды crontab

Общий формат команды приведён ниже:

crontab [-u имя_пользователя] имя_файла

или

crontab [-u имя_пользователя] [-l | -r | -e] [-i]

-u имя_пользователя – позволяет задать имя пользователя, с файлом crontab которого вы намерены работать. Этот ключ предназначен главным образом для режима суперпользователя (root), так как в режиме обычного пользователя вам просто не разрешат получить доступ к чужому файлу. Если вы хотите работать с собственным файлом crontab, то нет необходимости в использовании ключа -u.

Первая форма команды применяется для установки новой таблицы заданий из файла с заданным именем (имя_файла). Если, например, я выполню в своей системе такую команду:

crontab alexcron

то в каталоге /var/spool/cron будет создан файл с именем, совпадающим с моим регистрационным именем (в данном случае alex), а его содержимое будет взято из заданного файла alexcron. Если до этой команды уже существовал мой crontab-файл с именем alex, то все его записи будут полностью замещены записями из нового файла.

Вторая форма команды позволяет работать с существующим crontab-файлом. Её ключи мы будем рассматривать по мере изучения соответствующих операций. Редактирование будет выполняться с помощью текстового редактора, который установлен в переменной среды EDITOR. Если у вас эта переменная не установлена, то необходимо поместить в файл .bash_profile, расположенный в вашем домашнем каталоге, следующие команды:

EDITOR=vim; export EDITOR

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

Для получения содержимого crontab-файла на устройстве стандартного вывода применяется следующая команда:

$ crontab -l
# (alexcron installed on Wed Oct 7 18:42:19 2009)
# "чистка" старых bak-файлов по выходным
9 2 * * 6 find /home/alex -name "*.bak" -type f -atime +7 -exec rm {} \;
# контрольная проверка БД в пятницу
0,30 21-23 * * 5 /home/alex/bin/db_check.sh

С помощью этой же команды вы можете создать резервную копию crontab-файла в своём каталоге архивов:

crontab -l > $HOME/archives/alexcron

3.4. Редактирование crontab-файла

Редактировать crontab-файл напрямую крайне не рекомендуется. Вместо этого следует пользоваться командой

crontab -e

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

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

Например, можно добавить в рассматриваемый crontab-файл запись для выполнения глобального резервного копирования один раз в два месяца:

# глобальное резервное копирование - раз в два месяца
33 3 25 */2 * /home/alex/bin/total_backup.sh

Сохраним файл, выйдем из редактора и проверим результат:

$ crontab -l
# (alexcron installed on Wed Oct 7 18:42:19 2009)
# "чистка" старых bak-файлов по выходным
9 2 * * 6 find /home/alex -name "*.bak" -type f -atime +7 -exec rm {} \;
# контрольная проверка БД в пятницу
0,30 21-23 * * 5 /home/alex/bin/db_check.sh
# глобальное резервное копирование - раз в два месяца
33 3 25 */2 * /home/alex/bin/total_backup.sh

Начиная с этого момента, в 3:33 ночи 25 числа каждого второго месяца будет создаваться общая резервная копия моего домашнего каталога.

3.5. Удаление и восстановление crontab-файла

Команда

crontab -r

удаляет ваш crontab-файл. Ключ -i является защитным средством от случайного удаления – запрашивается подтверждение удаления, и если вы отвечаете "y|Y", то файл исчезнет бесследно. Впрочем, не зря мы говорили о создании резервной копии. Если вы по ошибке удалили свой crontab-файл, то восстановите его из резервной копии:

crontab $HOME/archives/alexcron

4. Заключение

Итак, мы во всех подробностях изучили использование систем планирования выполнения заданий at, batch и cron. Их практическую пользу невозможно переоценить. Даже приложив минимум усилий для освоения этих программ, вы можете извлечь огромную пользу из результатов их эксплуатации, освободить себя от необходимости помнить о десятках мелких операций, требующих ежедневного (еженедельного, ежемесячного) повторения. Как говорят отцы-основатели: "Пусть работает железный агрегат".


Ресурсы для скачивания


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux
ArticleID=495318
ArticleTitle=Планирование и автоматизация выполнения заданий средствами командной оболочки shell: Часть 2. Специализированные средства планирования
publish-date=06102010