Планировщик¶
Управление планировщиком 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. |
Запрос
Ответ
{"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. |