Перейти к содержанию

Планировщик

Управление планировщиком Grav на основе cron. Просмотр зарегистрированных заданий, проверка состояния установки cron, просмотр истории выполнения и запуск вручную.

Разрешения: api.scheduler.read / api.scheduler.write.

Список заданий планировщика

GET /scheduler/jobs

Выводит все зарегистрированные задания планировщика (как зарегистрированные плагинами, так и системные, например cache-purge, cache-clear, backups). Каждое задание содержит своё cron-выражение, флаг включения, статус (pending, пока оно не выполнялось), метку времени последнего запуска и то, что его запустило (cron, webhook, manual и т. д.), следующее запланированное выполнение, признак overdue (пропущен последний запланированный слот) и любую ошибку последнего запуска. Задание, определённое как замыкание, сообщает свой command как (closure). Вызывает onSchedulerInitialized, чтобы системные задания появлялись, даже если в этом запросе планировщик ещё никто не трогал.

Ответ

{"data": [{"id": "default-site-backup", "command": "Grav\\Common\\Backup\\Backups::backup", "expression": "0 3 * * *", "enabled": true, "status": "success", "last_run": "2026-03-26T03:00:00+00:00", "last_run_trigger": "cron", "next_run": "2026-03-27T03:00:00+00:00", "overdue": false, "error": null}]}

Коды ответов

Код Описание
200 Задания возвращены.
401 Не авторизован.
403 Нет разрешения api.scheduler.read.

Состояние планировщика

GET /scheduler/status

Сообщает состояние установки crontab для планировщика, команды cron и планировщика, которые ожидает Grav, действующего пользователя (whoami), диагностику работоспособности и то, установлен ли и включён ли необязательный плагин scheduler-webhook. Управляет панелью «настроен ли cron?» на панели управления Admin2. Каждое поле заполняется по возможности, поэтому хост, который не может сообщить, как запускается его планировщик, всё равно получает 200. Для демо-учётных записей cron_command, scheduler_command и whoami заменяются на (hidden in demo mode).

Ответ

{"data": {"crontab_status": "installed", "cron_detection": "crontab", "process_available": true, "last_run": "2026-08-20T12:00:00+00:00", "last_manual_run": null, "environment": "www.example.com", "environment_has_overrides": true, "last_run_environment": "cli", "cron_command": "* * * * * cd /path/to/grav && /usr/bin/php bin/grav scheduler", "scheduler_command": "bin/grav scheduler", "whoami": "www-data", "health": {}, "triggers": [], "webhook_installed": false, "webhook_enabled": false}}

Коды ответов

Код Описание
200 Состояние возвращено.
401 Не авторизован.
403 Нет разрешения api.scheduler.read.

crontab_status — одно из значений: not_installed, installed, unknown. cron_detection указывает, как это было определено, или unavailable, когда определение не удалось. process_available равно false, когда в PHP отключён proc_open; в этом случае POST /scheduler/run возвращает 501. last_run — последний запуск реальным триггером (cron или вебхук); last_manual_run — последний запуск из админки или API, который никогда не считается доказательством того, что cron работает.

environment — окружение, к которому разрешился этот запрос (обычно имя хоста), environment_has_overrides сообщает, есть ли у него собственная папка user/env/<name>/config, а last_run_environment — окружение, под которым планировщик фактически выполнялся в последний раз (cli для строки crontab, которая не передаёт --env). Когда последние два расходятся и переопределения существуют, задания, определённые только в переопределении, никогда не выполняются от этого триггера; scheduler_command уже содержит флаг --env, чтобы исправить строку crontab.


История выполнения заданий

GET /scheduler/history

История выполнения заданий с постраничной разбивкой, отсортированная сначала новые. Сохраняется только последний запуск каждого задания, поэтому здесь выводится одна запись на задание, которое выполнялось, а не все прошлые запуски. Каждая запись содержит идентификатор задания, его последний статус (unknown, если ничего не записано), последний запуск в виде метки времени ISO-8601 и любое сообщение об ошибке, захваченное при сбое.

Параметры

Имя Тип Обязательный Описание
page integer Нет Номер страницы (по умолчанию 1).
per_page integer Нет Элементов на странице (по умолчанию plugins.api.pagination.default_per_page, 20).

Ответ

{"data": [{"job_id": "default-site-backup", "status": "success", "last_run": "2026-03-26T03:00:00+00:00", "error": null}], "meta": {"pagination": {"page": 1, "per_page": 20, "total": 12, "total_pages": 1}}, "links": {"self": "/api/v1/scheduler/history?page=1&per_page=20"}}

Коды ответов

Код Описание
200 История возвращена.
401 Не авторизован.
403 Нет разрешения api.scheduler.read.

Запуск планировщика

POST /scheduler/run

Запускает задания планировщика сейчас, не дожидаясь cron. По умолчанию (mode: overdue) выполняет каждое включённое задание, пропустившее последний слот, который дало ему расписание, — это почти всегда то, что нужно при ручном запуске: задание считается «наступившим» только в ту самую минуту, которую называет его cron-выражение. Запуски, начатые так, записываются как ручные и никогда не считаются доказательством того, что cron настроен. Возвращает сводку, результаты по каждому заданию и состояние каждого задания после запуска. Для демо-учётных записей output каждого задания заменяется на (hidden in demo mode).

Параметры

Имя Тип Обязательный Описание
mode string Нет overdue (по умолчанию) запускает задания, пропустившие последний запланированный слот, due запускает только то, что запустил бы тик cron в эту минуту, all запускает каждое включённое задание независимо от его расписания.
job string Нет Запустить только это задание, независимо от его расписания. Игнорирует mode, и ответ сообщает mode: job.
force boolean Нет Устаревший псевдоним для mode: all.

Запрос

{"mode": "overdue"}

Ответ

{"data": {"message": "1 job ran successfully.", "mode": "overdue", "forced": false, "jobs_run": 1, "jobs_failed": 0, "duration": 1.42, "results": [{"id": "default-site-backup", "successful": true, "output": ""}], "job_states": {"default-site-backup": {"state": "success", "last-run": 1790000000, "trigger": "manual"}}}}

Коды ответов

Код Описание
200 Запуск завершён. jobs_run равно 0 (с сообщением Nothing to run: no jobs were due.), когда ничего не подошло.
400 Неизвестный mode.
401 Не авторизован.
403 Нет разрешения api.scheduler.write.
404 Нет задания с запрошенным job id.
409 Запрошенное задание отключено.
501 Запуск заданий недоступен, так как на хосте отключён proc_open в PHP.