Планирование заданий


Планировщик заданий операционной системы FreeBSD cron(8) позволяет администратору заставить систему выполнять произвольные команды через определенные интервалы времени. Если вы хотите создавать по ночам резервные копии базы данных или четыре раза в день перезапускать сервер имен, в этом вам поможет cron. Конфигурационные файлы cron называются crontab и администрируются с помощью утилиты crontab(1). У каждого пользователя есть свой файл crontab в каталоге /var/cron/tabs, а глобальный файл crontab хранится как /etc/crontab.

Файлы crontab пользователей и глобальный /etc/crontab

Назначение глобального файла /etc/crontab иное, чем у отдельных пользовательских файлов crontab. С помощью /etc/crontab пользователь root может указать, какую команду следует запустить и от имени какого пользователя. Например, в /etc/crontab пользователь root может сказать: «Это задание должно запускаться по вторникам в 22:00 с привилегиями root, а это задание — в 7:00 с привилегиями пользователя www». Другие пользователи могут запускать задания только от своего имени. Разумеется, root может редактировать файлы crontab пользователей.

Кроме того, любой пользователь в системе может просматривать содержимое файла /etc/crontab. Если вы не хотите, чтобы пользователи знали о наличии запланированного задания, поместите его в пользовательский crontab. Например, если сервер базы данных работает с правами непривилегированного пользователя, используйте crontab этого пользователя для выполнения заданий по обслуживанию базы данных.

Файл /etc/crontab считается системным файлом FreeBSD. Будьте внимательны и не перезапишите этот файл при обновлении системы. Один из способов упростить обновление /etc/crontab состоит в том, чтобы добавлять свои записи в конец файла, отделяя их несколькими строками знаков «#».

Наконец, если файл /etc/crontab можно редактировать в текстовом редакторе, то пользовательские файлы crontab следует редактировать с помощью команды crontab -e.

cron и окружение

Задания из crontab запускаются под управлением командного интерпретатора, и программам для нормальной работы могут потребоваться некоторые переменные окружения. Определения переменных окружения можно добавить прямо в строку команды, запускаемой из cron. cron не наследует никакие переменные окружения — все окружение программ должно быть определено явно. Вот, например, список переменных окружения из /etc/crontab в системе FreeBSD 7:

SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log

Да, не густо… В пользовательские файлы crontab вы можете добавлять любые переменные окружения, но при изменении /etc/crontab лучше придерживаться здорового консерватизма. Если для работы задания необходима какая-то нестандартная переменная окружения, то для запуска такого задания лучше применять пользовательский crontab, а не глобальный /etc/crontab, потому что этот файл в основном используется для обслуживания системы.

Формат файла crontab

Строки файла crontab, следующие за информацией об окружении, разбиты на шесть колонок. Первые пять колонок представляют время запуска команды: минута, час, число месяца, месяц года и день недели соответственно. Звездочка (*) в любой колонке означает «любой(ая)» (every one), а число означает «именно в это время». Счет минут, часов и дней недели начинается с 0, а чисел месяца и месяцев — с 1. Кроме того, благодаря старым разногласиям между AT&T и BSD, воскресенье можно обозначать двумя числами — 0 или 7. После колонок времени следует команда, которая должна быть запущена в указанное время.

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

Примеры содержимого crontab

Предположим, мы имеем дело с файлом crontab непривилегированного пользователя и собираемся запланировать запуск программы обслуживания. В файле /etc/crontab имеются заголовки колонок, а здесь будет показано содержимое пользовательского файла crontab. (Чтобы эти примеры можно было использовать в /etc/crontab, перед командой нужно добавить имя пользователя.) Ниже представлен пример задания, которое запускает сценарий /usr/local/bin/maintenance.sh каждый час на 55-й минуте:

55 * * * * /usr/local/bin/maintenance.sh

Звездочки говорят о том, что cron должен запускать это задание каждый час каждого числа каждого месяца и каждый день недели. Число 55 предписывает cron запускать задание на 55-й минуте.

Чтобы то же самое задание запускать каждый день в 13:55, строка должна выглядеть так:

55 13 * * * /usr/local/bin/maintenance.sh

Здесь число 13 представляет час в сутках, а 55 — количество минут после часа.

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

* 8 * * * /usr/local/bin/maintenance.sh

Это неправильно. Да, задание будет выполняться в 8 часов утра. Но точно так же оно будет выполняться в 8:01, 8:02, 8:03 и т. д., до 9:00. Если задание выполняется больше одной минуты, такая строка быстро поставит систему на колени. Правильный способ указать 8:00 и только 8 часов утра:

0 8 * * * /usr/local/bin/maintenance.sh

Чтобы указать диапазон времени, скажем, для ежечасного запуска этой программы между 8:00 и 18:00 с понедельника по пятницу, нужна примерно такая строка:

55 8-18 * * 1-5 /usr/local/bin/maintenance.sh

Указывая точные моменты времени, разделяйте их запятыми:

55 8,10,12,14,16 * * * /usr/local/bin/maintenance.sh

Более того, можно указать равные интервалы времени, или шаги (steps). Например, чтобы программа запускалась каждые пять минут, введите такую строку:

*/5 * * * * /usr/local/bin/maintenance.sh

Шаги и диапазоны можно объединять. Например, если задание должно выполняться каждые пять минут, но не раньше, чем через минуту после предыдущего задания, то строка может выглядеть так:

1-56/5 * * * * /usr/local/bin/maintenance.sh

Дни выполнения задания можно определять в двух полях, указывая число месяца и день недели. Если указать и число месяца, и день недели, то задание будет запущено при выполнении любого из условий. Например, так программе cron указывают «запускать это задание 1-го и 15-го числа плюс каждый понедельник»:

55 13 * 1,15 1 /usr/local/bin/maintenance.sh

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

55 * * * * LD_LIBRARY_PATH=/usr/local/mylibs ; /usr/local/bin/maintenance.sh

Кроме того, с помощью символа @ cron поддерживает такие варианты планирования, как «ежегодно» или «ежедневно». Однако большинство из этих вариантов лучше не использовать, так как они допускают неоднозначную интерпретацию. Компьютер-то четко знает, что они означают, но люди могут ошибаться! Тем не менее одним из полезных вариантов является @reboot, который означает «всякий раз, когда производится загрузка системы». Он позволяет непривилегированным пользователям запускать задания во время загрузки системы. Чтобы использовать такую возможность, нужно вместо пяти колонок с определением времени вставить ключевое слово @reboot:

@reboot /usr/local/bin/maintenance.sh

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

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

Комментарии запрещены.