Как добавить задание в Cron
Одна из самых известных и удобных утилит для автоматизации задач на сервере - это Cron. Выполнение команд и скриптов по расписанию - вот чем занимается эта программа. Базовые действия, но именно с их помощью мы можем автоматизировать такие задачи, как резервное копирование, обновление и сбор данных, очистка временных файлов и многое другое.В этой статье мы уделим внимание файлу crontab, его синтаксису и написанию команд на конкретных примерах.
Cron и Crontab
Почему мы говорим о добавлении заданий в cron, но фактически используем команду crontab для этого?Cron - это системный демон, служба, сервис. То есть сама программа, которая следит за заданными командами, временем, реализует сам функционал.
Crontab - это, по сути своей, файл, куда мы записываем время, задание на выполнение и некоторые другие параметры.
Добавление задания и структура файла crontab
Для того чтобы открыть редактор для изменения или создания cron-задания для текущего пользователя, воспользуемся командой:crontab -e
Откроется редактор по умолчанию (например, nano или vim). Как его изменить, вы можете узнать в статье Как изменить редактор для crontab.Будьте внимательны, в классической раскладке клавиатуры qwerty буква E размещена рядом с R. Если вы введёте команду crontab с параметром -r - это удалит все правила из сrontab-файла текущего пользователя.

Вверху файла вы можете увидеть переменные окружения. Они задают условия выполнения заданий в Cron. В примере используются две переменные, которые чаще встречаются на рабочих серверах.
Основные переменные в crontab
- MAILTO - задаёт Email-адрес, на который будет отправляться отчёт о выполнении заданий cron. MAILTO="" отключает отправку;
- PATH - список директорий с исполняемыми файлами;
- SHELL - задаёт командный интерпретатор для запуска задач. По умолчанию: sh;
- HOME - директория из которой cron запускает команды. Важная переменная, если в командах используются относительные пути (например ./cron.sh), что является плохой практикой.
Расписание задаётся пятью значениями:
- Минуты часа (0-59)
- Часы суток (0-23)
- День месяца (1-31)
- Месяц года (1-12)
- День недели (0-7 (0 и 7 — воскресенье))
- * - соответствует любому значению (каждая минута, каждый час и т.д.);
- , - разделитель списка значений;
- - - диапазон значений;
- / - "делитель" значения.
* * * * * cron.sh >> /root/cron.log 2>&1
Eго можно трактовать как: Выполнять указанную команду каждую минуту(*) каждого часа(*) каждого дня месяца(*) каждого месяца года(*) каждый день недели(*). Если проще - каждую минуту. Это минимальный частотный период с которым cron может выполнять задание.Обратите внимание на то, что путь до исполняемого файла cron.sh не указан, при этом данное задание успешно выполняется:

Это происходит потому, что задана переменная окружения PATH, в которой указана директория, где расположен данный скрипт. Однако это дурной тон и такая запись использовалась только в качестве примера работы переменной окружения. На рабочих серверах всегда лучше использовать полный путь до исполняемого файла или скрипта.
Изменим расписание задания и добавим конкретное время запуска, например:
0 * * * * cron.sh >> /root/cron.log 2>&1
Это задание будет запускаться в 0 минут каждого часа, то есть раз в час.Как вы могли понять, 0 - это указание на конкретную минуту, нулевую. Чтобы команда запускалась каждый час в 20 минут, задание нужно привести к виду:
20 * * * * cron.sh >> /root/cron.log 2>&1
Эта же логика работает и с другими значениями времени и даты. Рассмотрим второе задание в примере:
20 4 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Оно запускается каждый день(*) в 4 часа 20 минут.Допустим, нам не нужно создавать резервную копию так часто, давайте изменим это задание на запуск по воскресеньям (0 или 7) в 3 часа ночи:

Также возможно указать несколько конкретных значений через запятую:
0 3 * * 0,3 /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Это задание будет запускаться каждое воскресенье и среду ровно в 3 часа ночи.Для указания периода, диапазона значений используем -. Задание будет запускаться по будням, с понедельника по пятницу (1-5), в 3 часа ночи:
0 3 * * 1-5 /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Очень часто для запуска задания через каждый установленный промежуток времени используется выражение вида:
*/30 * * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Это задание Cron будет запускать каждые 30 минут.Однако нам не нужно так много резервных копий, целесообразнее запускать резервное копирование каждые два дня:
0 0 */2 * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Кроме полей времени расписание может задаваться специальными человекочитаемыми сокращениями.
Временные сокращения crontab
- @reboot - запускать задание после загрузки системы;
- @hourly - каждый час;
- @daily - раз в день (в 00:00);
- @midnight = @daily;
- @weekly - раз в неделю (воскресенье в 00:00);
- @monthly - раз в месяц (1-го числа в 00:00);
- @annually - раз в год (1 января в 00:00);
- @yearly = @annually.
Для сохранения изменений в Crontab и выхода, если вы используете редактор Nano, нажмите на Ctrl + O и Ctrl + X.
Если вы используете Vim, нажмите Esc, введите команду :wq и нажмите Enter.
Вы получите уведомление о добавлении новых заданий:

Чтобы просмотреть список cron-заданий текущего пользователя можно воспользоваться командой:
crontab -l

Мы детально разобрали процесс добавления cron-заданий, синтаксис Crontab. Но если у вас возникнут трудности с этой задачей на наших VPS и выделенных серверах, вы всегда можете обратиться в техническую поддержку, мы будем рады вам помочь!
29 May 2025, 22:11:27