Выражение 0 0 1 * *
00 1 * * — стандартное cron-выражение для запуска 1-го числа каждого месяца в полночь. Используется массово в финансовых, биллинговых, отчётных системах. Эквивалент алиаса @monthly.
Разбор по полям:
- 0 — минута: 0 (ровно полночь, не 0:01).
- 0 — час: 0 (полночь).
- 1 — день месяца: 1-е число.
- * — месяц: любой (все 12).
- * — день недели: любой.
Запускается 12 раз в год: 1 января, 1 февраля, 1 марта... 1 декабря — независимо от того, выпадает ли это на выходной.
Бизнес-сценарии
- Биллинг (выставление счетов). Главное применение в SaaS. 1-го числа генерируются счета клиентам за прошлый месяц. Стрипом списываются платежи с подписок.
- Финансовые отчёты. P&L (отчёт о прибылях и убытках) за прошлый месяц. Cash flow. KPI команды.
- Зарплата. 1-го числа за прошлый месяц (или 25-го + 10-го для аванса+основной). У бухгалтерии есть несколько дней на проверку до отправки.
- Аналитика SaaS. MRR/ARR (Monthly/Annual Recurring Revenue), Churn rate, NPS опросы за месяц.
- Ротация логов. Архивирование логов за прошлый месяц в холодное хранилище (S3 Glacier, Yandex Object Storage Cold). Удаление старых.
- Очистка БД. Удаление soft-deleted записей старше 30 дней. Архивирование закрытых тикетов.
- SLA-отчёты. Расчёт uptime / availability за прошлый месяц. Если ниже SLA — расчёт компенсации клиентам.
- Email-дайджест. Newsletter «итоги месяца» для подписчиков. Отчёт о пользовании сервисом.
- Сертификаты SSL. Проверка истекающих сертификатов, автообновление через Let's Encrypt.
Месячные cron-задачи — самые опасные. Если что-то ломается, узнаёте об этом через 30 дней, когда не запустилось снова. Делайте логирование, алерты, и ОБЯЗАТЕЛЬНО — тестовый запуск в staging перед production.— Stripe Engineering Blog, 2018
Связанные паттерны
Подводные камни
- 30-дневная проверка. Если cron сломался, заметите только через месяц. Логируйте каждый запуск, отправляйте алерт в Slack/Telegram при failure.
- Тяжёлая нагрузка. 1-го числа в 0:00 — традиционное время для всех месячных задач. Многие сервера испытывают пик. Распределите: одни на 0:00, другие на 0:30, 1:00, 2:00...
- Часовые пояса. Для глобального бизнеса учитывайте: 1 января UTC = 31 декабря на западе (Лос-Анджелес), 2 января на востоке (Австралия). Аккуратно с финансовыми периодами.
- Тестирование. Тяжело тестировать «1-го числа». Подменяйте дату в тесте, или запускайте «через минуту» в staging для отладки.
- Idempotency. Если cron упал на полпути и перезапустился — не должен дублировать счета или начислять зарплату дважды. Используйте transaction + UPSERT + maker-checker pattern.
- POSIX crontab specification. IEEE / Open Group. pubs.opengroup.org/onlinepubs/9699919799/utilities/crontab.html. 2018.
- Stripe Engineering — Designing robust scheduled jobs. Stripe. stripe.com/blog/idempotency. 2017.
- man crontab 5 — Linux. Linux Documentation Project. man7.org/linux/man-pages/man5/crontab.5.html. 2024.
