Команда crontab

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

Команда crontab в подавляющем большинстве случаев вызывается с параметром -e, который позволяет использовать для редактирования упомянутого файла конфигурации выбранный пользователем текстовый редактор с интерфейсом командной строки, путь к бинарному файлу которого указывается с помощью переменной окружения $VISUAL.

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

$ crontab /путь/к/новому/файлу/crontab.txt

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

$ crontab -l

Каждая строка этого файла конфигурации может быть комментарием, объявлением переменной или описанием события.

Комментарии

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

Объявления переменных

Для объявления переменной используется следующий формат:

имя=значение

В отличие от сценариев командной оболочки bash, вы можете свободно использовать символы пробела до и после символов равенства (=). Тем не менее, их использование является нежелательной практикой.

Описания событий

Каждая строка с описанием события содержит дату, время, а также команду, которая будет исполнена, и имеет следующий формат:

<минута> <час> <день месяца> <месяц> <день недели> [пользователь] <команда>

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

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

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

0 6 * * 1-5 /home/user/alarm.sh

Однако, могут возникнуть некоторые проблемы в том случае, если у пользователя нет информации (или есть лишь противоречивая информация) о том, как нужно поступать со стандартными потоками ввода и вывода сценария. Обычно файл конфигурации crontab содержит объявление переменной MAILTO, позволяющее указать имя пользователя, которому нужно отправлять сообщения электронной почты с содержимым вывода команды (например, MAILTO=dave), но в том случае, если этот механизм не будет работать, могут возникнуть некоторые проблемы. Сценарий может завершать свою работу лишь потому, что его вывод никуда не передается.

По этой причине разумным решением является перенаправление стандартных потоков вывода и ошибок сценариев в какой-либо файл, причем обычно таким файлом является специальный файл /dev/null, при записи в который данные просто отбрасываются. Учитывая все вышесказанное, рассматриваемый пример описания события может быть преобразован следующим образом:

0 6 * * 1-5 /home/user/alarm.sh >> /dev/null 2>&1

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

Формат описания диапазонов числовых значений

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

Объявление Значение
* Любое числовое значение
*/5 Любое числовое значение, кратное 5
1-6 Любое числовое значение из диапазона от 1 до 6 (включительно)
0-30/5 Любое числовое значение из диапазона от 0 до 30, кратное 5
1,4,9 Значение 1, 4 или 9

Формат описания месяцев

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

Числовое значение Строковое значение Месяц
1 jan Январь
2 feb Февраль
3 mar Март
4 apr Апрель
5 may Май
6 jun Июнь
7 jul Июль
8 aug Август
9 sep Сентябрь
10 oct Октябрь
11 nov Ноябрь
12 dec Декабрь

Формат описания дней недели

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

Числовое значение Строковое значение День недели
0 Sunday Воскресенье
1 Monday Понедельник
2 Tuesday Вторник
3 Wednesday Среда
4 Thursday Четверг
5 Friday Пятница
6 Saturday Суббота
7 Sunday Воскресенье

Обратите внимание на то, что воскресенье может быть как началом (значение 0), так и концом недели (значение 7).

Примеры описаний событий

Получение сообщений электронной почты

Следующее описание события позволяет получать сообщения электронной почты через каждые 10 минут с помощью утилиты fetchmail:

# get e-mail every ten minutes
*/10 * * * * fetchmail

Отправка сообщения электронной почты

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

# send myself a birthday greeting
0 9 7 28 * mail -s'Happy Birthday' Happy Birthday!%Many Happy Returns - you old fart!%.%%

Создание резервной копии базы данных

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

# back up my recipe database every Monday
30 5 * * 1 mysqldump --opt recipes > /home/user/backups/recipes.sql