Выражения Cron Практическое руководство с реальными примерами

Опубликовано
Выражения Cron: Практическое руководство с реальными примерами 1
Реклама · УДАЛИТЬ?

Выражение cron — это пять пробелов, разделяющих полей, которые сообщают планировщикам Unix, когда запускать команду. Пять полей, несколько специальных символов и несколько распространённых шаблонов — это вся модель мышления. В этом руководстве описаны синтаксис, символы, которые путают людей, и расписания, которые действительно используют разработчики.

Пять полей

Стандартный cron использует пять позиционных полей:

* * * * *
│ │ │ │ └─ Day of week   (0–7, Sunday = 0 or 7)
│ │ │ └─── Month         (1–12)
│ │ └───── Day of month  (1–31)
│ └─────── Hour          (0–23)
└───────── Minute        (0–59)

AWS EventBridge и планировщик Quartz для Java добавляют поле в начало, делая их шесть полей в общей сложности. Все остальные поля сдвигаются вправо. Это вызывает трудности у разработчиков, переключающихся между средами — выражение Quartz, вставленное в стандартный crontab, будет запускаться по неверному расписанию без каких-либо предупреждений. секунды Следуйте пятиполюсной POSIX cron, если ваша платформа не требует шести полей.

Специальные символы

Любое значение — соответствует каждой единице

СимволЗначениеПример
*— каждую минуту* * * * * — в 9 утра и в 5 часов
,Список ценностей0 9,17 * * * — каждый час с 9 утра до 5 часов
-Диапазон0 9-17 * * * Шаговый интервал
/— каждые 15 минут*/15 * * * * Нет конкретного значения (только Quartz/AWS)
?— 15-е число каждого месяца, любой день недели0 0 15 * ? Последнее (только Quartz/AWS)
L— последний день каждого месяца0 0 L * ? Ближайший день недели (только Quartz/AWS)
W— ближайший день недели к 15-му0 0 15W * ? Стандартный

принимает только crontab Если вы видите *, ,, -и /в выражении, оно было написано для Quartz или AWS EventBridge — не копируйте его в Linux crontab без изменений. ?, L, или W Таблица с расписаниями, которые действительно используют разработчики

Это часть, которую стоит сохранить. Создайте и проверьте любое из этих выражений с помощью

Генератора выражений IO Tools Cron Редко подходит для использования в производственной среде.

ОписаниеВыражение CronПримечания
Каждую минуту* * * * *Проверка состояния здоровья, короткие циклы запроса
Каждые 5 минут*/5 * * * *Оттепление кэша, синхронизация потоков
Каждые 15 минут*/15 * * * *Каждые 30 минут
Эквивалентно*/30 * * * *Каждый час (в точности в час) 0,30 * * * *
Запускается в :00 каждого часа0 * * * *Каждые 6 часов
Синхронизация данных, инкрементальные экспорты0 */6 * * *Ежедневно в полночь UTC
Стандартный ежедневный запуск0 0 * * *Ежедневно в 9 утра UTC
Генерация утреннего отчёта0 9 * * *Дни недели в 9 утра UTC
Работа в рабочие часы (понедельник–пятница)0 9 * * 1-5Дни недели в 8:30 утра UTC
Доставка отчёта до начала рабочего дня30 8 * * 1-5Каждую воскресенье в 2 часа ночи
Еженедельное техническое обслуживание, резервные копии в периоды низкой нагрузки0 2 * * 0Первый день каждого месяца
Расчёты ежемесячных платежей, повторяющиеся отчёты0 0 1 * *1 января в полночь
Ежегодные сбросы, задачи начала года0 0 1 1 *Проблема с часовым поясом

Cron не имеет осознания часового пояса. Он работает в том часовом поясе, который настроен на сервере — на большинстве систем Linux это UTC. Это обычно не вызывает проблем, пока у вас нет задач, связанных с рабочими часами, или пользователи из разных регионов, которые не понимают, почему «отчёт в 9 утра» приходит в 14:00.

Наиболее безопасные настройки:

Установите сервер в UTC. Преобразуйте в локальное время в логике приложения, а не в расписании cron.

  • Комментируйте каждую задачу cron с эффективным локальным временем, чтобы следующий человек, читающий crontab, не должен был угадывать.
  • При использовании облачных планировщиков (AWS EventBridge, Google Cloud Scheduler) проверяйте поле часового пояса — большинство поддерживает названия IANA, что устраняет неопределённость.
  • Проверка: Рассчитывайте следующие запуски до развертывания
# Always comment with the effective local time
# Runs daily at midnight UTC (= 8pm EST / 5pm PST)
0 0 * * * /usr/bin/python3 /opt/scripts/daily_report.py

Развертывание задачи cron и обнаружение того, что она запускается каждую минуту вместо каждые часы — это ритуал. Пропустите это.

Расчёт следующего запуска IO Tools Cron

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

Добавление задачи cron на Linux

# Install croniter (Python) for quick expression testing
pip install croniter

python3 -c "
from croniter import croniter
from datetime import datetime

cron = croniter('*/15 * * * *', datetime.utcnow())
for _ in range(5):
    print(cron.get_next(datetime))
"

В конце строки резервного копирования перенаправляет stderr в stdout, так что оба потока попадают в лог-файл. Без этого cron ошибки попадают в почтовый ящик — и никто не проверяет это.

# Open the crontab editor for the current user
crontab -e

# Format: minute hour day month weekday command
# Run backup script daily at 2:30am UTC
30 2 * * * /home/user/scripts/backup.sh >> /var/log/backup.log 2>&1

# Run a Python script every 5 minutes
*/5 * * * * /usr/bin/python3 /home/user/scripts/sync.py

# View current crontab entries
crontab -l

# Edit another user's crontab (requires root)
crontab -u www-data -e

The 2>&1 Запланированный поток GitHub Actions

GitHub Actions использует тот же пятиполе синтаксис cron, всегда в UTC. Нет переключения часового пояса.

Одна оговорка: запланированные потоки GitHub Actions могут быть задержаны до 15 минут в периоды высокой нагрузки. Не полагайтесь на них для задач, требующих точного времени.

name: Nightly Data Export

on:
  schedule:
    # Runs at 1:00 AM UTC every weekday
    - cron: "0 1 * * 1-5"
  workflow_dispatch: # Allow manual trigger

jobs:
  export:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run export script
        run: python scripts/export.py

Когда стандартный cron недостаточен

Стандартный cron решает большинство случаев на одном сервере. Его ограничения становятся проблемами при масштабировании:

Нет повторного запуска при сбое.

  • Если задача завершается с ошибкой, следующий запуск будет происходить в следующее время по расписанию — нет автоматического повтора. Нет распределённого блокирования.
  • На нескольких серверах, запускающих одинаковые crontab, задача запускается одновременно. Нет наблюдаемости.
  • Нет встроенной панели для истории запусков, уведомлений об ошибках или отслеживания продолжительности. Проблема
Лучшее альтернативное решениеЛогика повтора и очереди задач
Celery Beat (Python), Sidekiq-Cron (Ruby)Облачные расписания с повторами
AWS EventBridge + Lambda, Google Cloud SchedulerЗапуск в CI/CD-процессе
Запланированные задачи GitHub ActionsНаблюдаемое управление задачами
Airflow, Prefect, TemporalДля скриптов на одном сервере, cron по-прежнему является правильным инструментом — он прост, надёжен и не требует зависимостей. Для любых задач, требующих гарантий повтора, распределённого выполнения или видимости сбоев, специализированный очередной механизм быстро окупается.

для построения вашего следующего расписания без необходимости запоминания синтаксиса, и

Используйте Генератор выражений Cron Расчёт следующего запуска Cron для проверки того, что запускается вовремя. Выражения Cron: Практическое руководство с реальными примерами 2

Хотите убрать рекламу? Откажитесь от рекламы сегодня

Установите наши расширения

Добавьте инструменты ввода-вывода в свой любимый браузер для мгновенного доступа и более быстрого поиска

в Расширение Chrome в Расширение края в Расширение Firefox в Расширение Opera

Табло результатов прибыло!

Табло результатов — это интересный способ следить за вашими играми, все данные хранятся в вашем браузере. Скоро появятся новые функции!

Реклама · УДАЛИТЬ?
Реклама · УДАЛИТЬ?
Реклама · УДАЛИТЬ?

новости с техническими моментами

Примите участие

Помогите нам продолжать предоставлять ценные бесплатные инструменты

Купи мне кофе
Реклама · УДАЛИТЬ?