Обновить настройки cookies

Как добавить задание в Cron

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

Cron и Crontab

Почему мы говорим о добавлении заданий в cron, но фактически используем команду crontab для этого?
Cron - это системный демон, служба, сервис. То есть сама программа, которая следит за заданными командами, временем, реализует сам функционал.
Crontab - это, по сути своей, файл, куда мы записываем время, задание на выполнение и некоторые другие параметры.

Добавление задания и структура файла crontab

Для того чтобы открыть редактор для изменения или создания cron-задания для текущего пользователя, воспользуемся командой:
crontab -eОткроется редактор по умолчанию (например, nano или vim). Как его изменить, вы можете узнать в статье Как изменить редактор для crontab.
Будьте внимательны, в классической раскладке клавиатуры qwerty буква E размещена рядом с R. Если вы введёте команду crontab с параметром -r - это удалит все правила из сrontab-файла текущего пользователя.
20250529_pyAN5tNv
Вверху файла вы можете увидеть переменные окружения. Они задают условия выполнения заданий в 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>&1Eго можно трактовать как: Выполнять указанную команду каждую минуту(*) каждого часа(*)  каждого дня месяца(*)  каждого месяца года(*)  каждый день недели(*). Если проще - каждую минуту. Это минимальный частотный период с которым cron может выполнять задание.
Обратите внимание на то, что путь до исполняемого файла cron.sh не указан, при этом данное задание успешно выполняется:
20250530_22be54Z5
Это происходит потому, что задана переменная окружения 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 часа ночи:
20250529_8ZdgH2sH
Также возможно указать несколько конкретных значений через запятую:
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.
Вы получите уведомление о добавлении новых заданий:
20250529_asQdP7yu
Чтобы просмотреть список cron-заданий текущего пользователя можно воспользоваться командой:
crontab -l20250530_ApI5nYah
Мы детально разобрали процесс добавления cron-заданий, синтаксис Crontab. Но если у вас возникнут трудности с этой задачей на наших VPS и выделенных серверах, вы всегда можете обратиться в техническую поддержку, мы будем рады вам помочь!
29 May 2025, 22:11:27

Премиум выделенные серверы

Смотреть конфигурации