Гид по технологиям

Краткое введение в cron-задания

• 6 min read • Системное администрирование • Обновлено 26 Nov 2025
Краткое руководство по cron: crontab и синтаксис
Краткое руководство по cron: crontab и синтаксис

Кратко

Cron — это планировщик задач в UNIX-подобных системах. В статье объясняется, как читать и редактировать crontab, как работает синтаксис строк cron, какие есть шаблоны и переменные окружения, а также перечислены типичные ошибки и альтернативы. Подойдёт системным администраторам и разработчикам, которые хотят автоматизировать периодические задачи.

Версия и автор

Version 1.0
Author: Falko Timme

О чём эта статья

Эта статья кратко вводит в cron-задания: что такое cron, как выглядят строки в crontab, как создавать, удалять и импортировать задачи, какие есть специальные строки и переменные. Приведены примеры, рекомендации по отладке и список альтернатив для продвинутых сценариев.

Важно: я не даю гарантий, что всё сработает в вашей системе без адаптации. Проверяйте пути и права доступа.

1. crontab

Команда для создания/редактирования, просмотра и удаления cron-заданий — crontab. Если вызвать её с опцией -u, вы указываете имя пользователя, crontab которого хотите изменить. Без -u команда работает с crontab текущего пользователя (того, кто выполняет команду).

Примеры команд:

crontab -l

выводит список cron-заданий для пользователя, от которого вы вошли в систему:

server1:~# crontab -l  
 * * * * * /usr/local/ispconfig/server/server.sh > /dev/null 2>> /var/log/ispconfig/cron.log  
 30 00 * * * /usr/local/ispconfig/server/cron_daily.sh > /dev/null 2>> /var/log/ispconfig/cron.log  
 server1:~#
crontab -u exampleuser -l

покажет все cron-задания пользователя exampleuser.

crontab -e

позволяет создать или изменить cron-задания текущего пользователя (редактор определяется переменной VISUAL/EDITOR или умолчанием).

crontab -u exampleuser -e

редактирует crontab пользователя exampleuser.

crontab -r

удаляет все cron-задания пользователя, от имени которого выполнена команда.

crontab -u exampleuser -r

удаляет все cron-задания exampleuser.

Если вы подготовили текстовый файл с заданиями, его можно импортировать в crontab. Например, предположим, вы создали файл /tmp/my_cron_jobs.txt:

vi /tmp/my_cron_jobs.txt

… со следующим содержимым:

| 30 00 * * * /path/to/script |

Создать crontab из этого файла можно так:

crontab /tmp/my_cron_jobs.txt

(Или для exampleuser:

crontab -u exampleuser /tmp/my_cron_jobs.txt

)

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

Для подробностей смотрите:

man crontab

2. Синтаксис cron-задания

Строка cron состоит из шести полей:

     
              field          allowed values  
               -----          --------------  
               minute         0-59  
               hour           0-23  
               day of month   1-31  
               month          1-12 (or names, see below)  
               day of week    0-7 (0 or 7 is Sun, or use names)

Когда указываете день недели, и 0, и 7 считаются воскресеньем.

Поле может быть звездочкой (*), что означает «все значения» (from first to last).

Для полей month и day of week можно использовать имена — первые три буквы (регистр не имеет значения), например sun или SUN для Sunday, mar или MAR для March. В русскоязычной документации часто встречаются английские имена дней и месяцев, так как это синтаксис cron.

Рассмотрим примеры из предыдущего раздела:

          • /usr/local/ispconfig/server/server.sh > /dev/null 2>> /var/log/ispconfig/cron.log

Это означает: выполнить /usr/local/ispconfig/server/server.sh каждую минуту. Вывод перенаправляется в /dev/null, а STDERR добавляется в лог.

30 00 * /usr/local/ispconfig/server/cron_daily.sh > /dev/null 2>> /var/log/ispconfig/cron.log

Это означает: выполнить /usr/local/ispconfig/server/cron_daily.sh один раз в день в 00:30.

Поле запуска по дате может задаваться двумя способами: день месяца и день недели. Если оба поля ограничены (т.е. не ), команда запустится, когда совпадёт либо день месяца, либо день недели. Пример: 30 4 1,15 5 запустит команду в 04:30 1-го и 15-го числа каждого месяца, а также каждую пятницу.

Вы можете использовать диапазоны и списки:

  • 1,2,5,9 — перечисление: первый, второй, пятый и девятый (минуты/часы/дни…)
  • 0-4,8-12 — диапазоны: 0 до 4 и 8 до 12
  • */5 — каждое пятое значение (каждые 5 минут/часов и т.д.)
  • 1-9/2 эквивалентно 1,3,5,7,9

Диапазоны или списки имён не разрешены (например, Mon-Wed с именами не валиден в большинстве реализаций).

Пример комбинированного задания:

1,7,25,47 */2 * * * command

означает: выполнять command каждую вторую неделю или, точнее, каждые 2 часа в минуты 1, 7, 25 и 47.

Вместо пяти первых полей можно использовать одну из восьми специальных строк:

              string         meaning  
               ------         -------  
               @reboot        Run once, at startup.  
               @yearly        Run once a year, "0 0 1 1 *".  
               @annually      (same as @yearly)  
               @monthly       Run once a month, "0 0 1 * *".  
               @weekly        Run once a week, "0 0 * * 0".  
               @daily         Run once a day, "0 0 * * *".  
               @midnight      (same as @daily)  
               @hourly        Run once an hour, "0 * * * *".

Эти специальные ярлыки делают crontab короче и удобнее для шаблонных задач.

Вы также можете определить переменные в crontab (name=value) для управления окружением выполнения задач:

# use /bin/bash to run commands, instead of the default /bin/sh
SHELL=/bin/bash
# mail any output to exampleuser, no matter whose crontab this is
MAILTO=exampleuser
# set the PATH variable to make sure all commands in the crontab are found
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

* * * * * my_command

Важно: если вы не зададите PATH в crontab, используйте полные пути к программам. Вместо rsync пишите /usr/bin/rsync. Узнать полный путь можно через which:

which rsync
server1:~# which rsync  
 /usr/bin/rsync  
 server1:~#

Для подробностей о формате смотрите:

man 5 crontab

Отладка и лучшие практики

  • Всегда используйте полные пути к файлам и программам. Cron запускается в ограниченном окружении.
  • Перенаправляйте stdout и stderr в лог-файлы, если хотите сохранить вывод: >> /path/to/log 2>&1.
  • Проверяйте переменные окружения: если команда работает в интерактивной оболочке, но не в cron, скорее всего PATH или другие переменные отличаются.
  • Тестируйте задания вручную с теми же пользователем и переменными окружения, что и в crontab.
  • Избегайте частых задач с таймером меньше 1 минуты — cron не гарантирует жесткую точность, и большие нагрузки могут «накопиться».

Когда cron не подходит (контрпримеры)

  • Когда нужны миллисекундные задержки или высокоточная периодичность — используйте специализированные планировщики или системные таймеры реального времени.
  • Для локально-зависимых сервисов с перезапуском и зависимостями лучше подходят systemd-timers и unit-файлы в systemd.
  • Для распределённых задач с очередями и повторными попытками лучше использовать очередь задач (RabbitMQ, Celery, Kubernetes CronJob).

Альтернативные подходы

  • systemd timers — интеграция с systemd, зависимость от unit’ов, удобные опции перезапуска и журналирования.
  • at — одноразовые отложенные задания.
  • Kubernetes CronJob — для контейнеризованных нагрузок в кластере.
  • Планировщики задач на уровне приложения (например, Sidekiq/Resque для Ruby, Celery для Python) — для сложной логики повторов и распределенных задач.

Быстрая шпаргалка (cheat sheet)

  • Каждая строка: min hour day month weekday command
    • — любое значение
  • */N — каждое N-е значение
  • A,B,C — список значений
  • X-Y — диапазон
  • @reboot, @daily, @hourly, @monthly, @weekly, @yearly — специальные шаблоны
  • Обязательно указывайте SHELL и PATH, если команды не находятся в стандартных местах

Примеры полезных выражений:

# каждую минуту
* * * * * /usr/bin/some-script

# каждый день в 02:30
30 2 * * * /usr/local/bin/backup.sh

# каждый час в 15 минут
15 * * * * /usr/local/bin/check.sh

# каждое воскресенье в 03:00
0 3 * * 0 /usr/local/bin/weekly-maintenance.sh

# при загрузке системы
@reboot /usr/local/bin/startup-task.sh

Роль-по-роль: контрольный список

Администратор:

  • Проверить права на скрипт и на лог-файлы (владелец/chmod).
  • Установить MAILTO для получения вывода или настроить логирование.
  • Добавить PATH и SHELL в crontab.
  • Тестировать задания вручную под пользователем.

Разработчик:

  • Делать скрипты идемпотентными (безопасные повторные запуски).
  • Логировать только полезную информацию.
  • Обрабатывать ошибки и возвращать код выхода.

Критерии приёмки (как проверить, что задача корректна)

  • Скрипт выполняется вручную без ошибок под тем же пользователем и окружением.
  • Cron-запись присутствует в crontab (-l отображает строку).
  • Логи показывают ожидаемый вывод или отсутствие ошибок.
  • При необходимости — письма на адрес MAILTO или централизованное логирование получили запись.

Малые методики: как добавить новую задачу безопасно

  1. Вручную протестируйте команду в шелле под нужным пользователем.
  2. Добавьте запись в crontab через crontab -e или создайте временный файл и crontab /tmp/file.
  3. Убедитесь, что PATH/SHELL установлены, и добавьте перенаправление вывода в лог.
  4. Наблюдайте за выполнением в первые 1–2 раза и проверяйте логи.
  5. При проблемах временно измените расписание на частое выполнение для ускоренной отладки.

Краткий словарь (1 строка определения)

  • cron: системный демон, запускающий задачи по расписанию.
  • crontab: таблица (файл) с заданиями для cron; также команда для управления этой таблицей.
  • SHELL/PATH: переменные окружения, влияющие на исполнение команд в crontab.
  • @reboot/@daily и т. п.: специальные шаблоны для часто используемых расписаний.

Безопасность и приватность

  • Скрипты, запускаемые из cron, выполняются с привилегиями пользователя, чьим является crontab. Проверяйте права доступа и нежелательные включения конфиденциальных данных в лог.
  • Не храните пароли в открытом виде в crontab; используйте защищённые хранилища или переменные окружения с ограниченным доступом.

Итог

Cron — простой и надёжный инструмент для регулярных задач. Главное — правильно указать пути, окружение и логирование. Для сложных или распределённых сценариев рассмотрите альтернативы (systemd-timers, Kubernetes CronJob, очереди задач).

Ресурсы для дальнейшего чтения

man crontab
man 5 crontab

Краткие выводы

  • Используйте полные пути и задавайте PATH в crontab.
  • Логируйте stdout/stderr и проверяйте журналы при отладке.
  • Для сложных сценариев выбирайте systemd-timers или специализированные планировщики.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро