Выражение 0 * * * *
0* * * * — самое простое периодическое cron-выражение. Запускается в начале каждого часа: 00:00, 01:00, 02:00... 23:00. Итого 24 раза в сутки. Эквивалент алиаса @hourly в Vixie cron.
Разбор:
- 0 — минута 0 (ровно в начале часа, не в :01 или :30).
- * — час: любой (0-23).
- * — день месяца: любой.
- * — месяц: любой.
- * — день недели: любой.
Если хотите запуск НЕ в :00, а в другое время — измените первое поле: 15 * * * * (в :15), 30 * * * * (в :30), 45 * * * * (в :45).
Сценарии применения
- Сбор метрик и логов. Каждый час забираем метрики из приложений в централизованное хранилище (Prometheus, Grafana, ELK).
- Обновление кэша. Курсы валют от ЦБ, прайсы поставщиков, RSS-фиды. Час — баланс актуальности и нагрузки.
- Health checks. Проверка работоспособности веб-сервисов, БД, очередей. Алерт при ошибке.
- Email digest. Сборка уведомлений за прошлый час, отправка пачкой (вместо отдельных писем за каждое событие).
- Sync с внешними API. Импорт новых данных из CRM, ERP, банковских API.
- Очистка очередей. Удаление выполненных задач старше 1 часа, retry неудачных.
- Инкрементальный backup. Дельта-бэкап (только изменения за последний час). Полный — раз в сутки ночью.
- Cache warming. Прогрев кэша популярных страниц перед пиком трафика.
- Aggregation. Подсчёт метрик за прошлый час: уникальные посетители, заказы, ошибки.
- Token rotation. Обновление коротко-живущих токенов (если они истекают через 2 часа).
Каждый час — золотая середина. Чаще создаёт лишнюю нагрузку. Реже даёт устаревшую информацию. 80% периодических задач в production укладываются в hourly расписание.— Site Reliability Engineering, Google, 2016
Связанные шаблоны
Распределение нагрузки
Если у вас несколько hourly cron-задач, все запускающиеся в :00 — это пик нагрузки на сервер. В 14:00:00 одновременно стартуют 5 задач, CPU в 100%, всё тормозит. Решение — распределить:
# crontab пример с распределением нагрузки 0 * * * * /opt/scripts/sync-metrics.sh # :00 — критичный 10 * * * * /opt/scripts/cache-rates.sh # :10 — обновление курсов 20 * * * * /opt/scripts/process-queue.sh # :20 — очередь 30 * * * * /opt/scripts/health-check.sh # :30 — health check 45 * * * * /opt/scripts/cleanup-temp.sh # :45 — очистка 55 * * * * /opt/scripts/aggregate-stats.sh # :55 — агрегация
Подводные камни
- Overlap. Если задача занимает >1 часа, две копии будут параллельно. Используйте flock или distributed lock.
- Часовой пояс. 0 * * * * запускается в начале часа в timezone сервера. Для UTC vs МСК поведение РАЗНОЕ при анализе данных «за последний час».
- Логирование. 8760 запусков в год = много логов. Используйте уровни (INFO + WARN/ERROR), ротацию.
- Idempotency. Задача может запуститься дважды (после рестарта). Не должна делать дубль действий.
- Производительность. Hourly = 168 раз в неделю. Тяжёлая задача, занимающая 30 минут × 168 = 84 часа/неделю CPU. Подумайте о времени выполнения.
- POSIX crontab specification. IEEE / Open Group. pubs.opengroup.org/onlinepubs/9699919799/utilities/crontab.html. 2018.
- man crontab 5 — Linux. Linux Documentation Project. man7.org/linux/man-pages/man5/crontab.5.html. 2024.
- Site Reliability Engineering: How Google Runs Production Systems. Beyer, Jones, Petoff, Murphy. O'Reilly. 2016.
