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