Cron-задачи как пайплайны по расписанию, а не «магический» shell
Задачи по расписанию оформляются как триггеры пайплайна: те же функции и секреты, что у HTTP-маршрутов, единая история выполнений и настраиваемые повторы при сбоях.
Обновлено: 2026-04-20
Кратко
Суть ответа
Cron-задачи как пайплайны по расписанию, а не «магический» shell. Один ID функции может питать HTTP-маршрут и шаг пайплайна по расписанию — без дублирования деревьев кода.
Когда подходит и когда нет
- Ночной ETL
- Ротация сертификатов/токенов
- Периодический опрос интеграций
На что обратить внимание
- Системные таймеры не чинят изоляцию зависимостей.
- Хочется единой модели секретов и логов между фоновой задачей и API.
Ситуация: нагрузка и где обычно ломается
Почему «cron на своём сервере» часто даёт сюрпризы в эксплуатации
Если вывод заданий уходит лишь в почту root или в локальные логи без централизованного мониторинга, сбои могут длительно оставаться незамеченными.
Когда расписание живёт только на одной VPS, расхождение версий окружения и секретов, а также вопрос «кто и когда менял cron», почти неизбежно превращают каждый инцидент в ручной разбор по SSH.
Записи в crontab редко проходят тот же конвейер версионирования, что основной код: сложно восстановить, какая именно сборка выполнялась в запланированное время.
Параллельные запуски одних и тех же заданий без явных правил перекрытия и блокировок повышают риск порчи общего состояния — к расписаниям в пайплайне стоит относиться с той же аккуратностью, что и к обработчикам webhooks.
Когда упрощённых рецептов мало
Почему только системные таймеры или cron на одной машине не закрывают изоляцию, секреты и единый журнал с HTTP API
Системные таймеры не чинят изоляцию зависимостей.
Хочется единой модели секретов и логов между фоновой задачей и API.
Как Inquir помогает в этом сценарии
Как Inquir сводит HTTP API и задачи по расписанию в одну модель функций и пайплайнов
Один ID функции может питать HTTP-маршрут и шаг пайплайна по расписанию — без дублирования деревьев кода.
Cron проверяется при сохранении; планировщик помнит следующий запуск пайплайна — правки расписания переносятся аккуратно.
Что вы получаете на платформе
Что даёт платформа для cron-пайплайнов вместо ручного crontab на сервере
Проверка cron при сохранении
Некорректное выражение отклоняется при сохранении, а не «внезапно» в проде.
Шаг планировщика и перекрытия
Нагрузка минутного масштаба; для длинных задач — пропуск при уже идущем запуске и явные правила перекрытия.
История запусков
Видно, отработала ли задача, без поиска по логам на сервере.
Оповещения
Подключите мониторинг к доле ошибок или к SLA по длительности выполнения.
Что сделать дальше, по шагам
Как перенести cron на пайплайны Inquir с расписанием
Сначала перенесите логику в версионируемый обработчик функции и проверьте его ручными вызовами, затем подключите триггер расписания (schedule) с корректным cron-выражением.
Вынести логику из shell
Перенесите сценарий в версионируемый обработчик с предсказуемым окружением.
Проверка вручную
Запускайте функцию из консоли до тех пор, пока результат не совпадёт с ожиданием для типичных входных данных.
Расписание
Триггер типа schedule и валидная cron-строка в API/UI.
Пример кода
Типовые паттерны cron-задач
Два распространённых паттерна: инкрементальная синхронизация с курсором (безопасно повторять) и генерация отчёта с веерной рассылкой.
export async function handler(event) { // Read cursor from env so re-runs do not re-process old records const since = process.env.SYNC_CURSOR ?? new Date(Date.now() - 86_400_000).toISOString(); const records = await source.fetchUpdatedSince(since); await destination.upsertBatch(records); // idempotent by record ID const newCursor = records.at(-1)?.updatedAt ?? since; // Update cursor in your config/store for next run return { synced: records.length, cursor: newCursor }; }
export async function handler(event) { const rows = await buildReport(); await storage.upload(rows, { key: `reports/${new Date().toISOString().slice(0, 10)}.csv` }); // Fan out — each recipient gets a separate pipeline step await Promise.all( recipients.map((r) => global.durable.startNew('send-report', undefined, { recipientId: r.id, rowCount: rows.length })), ); return { rows: rows.length, notified: recipients.length }; }
Когда подходит и когда нет
Когда имеет смысл cron-пайплайны на Inquir вместо задач только на своём сервере
Когда это уместно
- Ночной ETL
- Ротация сертификатов/токенов
- Периодический опрос интеграций
Когда лучше не трогать
- Субсекундные периодические задачи — сверяйтесь с таймерами платформы
Вопросы и ответы
Вопросы и ответы
Запуск длиннее интервала?
Идемпотентность, локи или skip-if-running внутри хендлера, чтобы перекрытия не портили состояние.
Чем лучше crontab на одной машине?
Версионируемые бандлы, изоляция контейнера, записи вызовов и те же секреты, что у HTTP — плюс графы шагов.
Часовой пояс cron?
Зафиксируйте ожидание команды (часто UTC); учитывайте DST для бизнес-часов.