Gateway
Восстановление после перезапуска
Перезапуск Gateway не приводит к потере состояния агента. Диалоги, расшифровки, запланированные задания, записи фоновых задач и исходящие сообщения в очереди хранятся на диске, а работа, прерванная во время хода, обнаруживается и автоматически возобновляется после запуска Gateway. Ручное вмешательство не требуется, и настраивать ничего не нужно: восстановление включено всегда.
На этой странице описано, что сохраняется после перезапуска, как обнаруживается прерванная работа и как происходит автоматическое возобновление.
Что сохраняется после перезапуска
| Состояние | Хранилище | Поведение при перезапуске |
|---|---|---|
| История диалога | База данных SQLite отдельного агента | Не изменяется; сеансы продолжаются на основе сохранённой расшифровки |
| Прерванный ход основного сеанса | Строка сеанса и расшифровка в базе данных SQLite отдельного агента | Автоматически возобновляется через несколько секунд после запуска |
| Запуски субагентов | SQLite (общая база данных состояния) | Реестр восстанавливается при загрузке; прерванные запуски возобновляются |
| Фоновые задачи | SQLite (общая база данных состояния) | Сверяются при загрузке; потерявшие владельца запуски восстанавливаются или помечаются как потерянные |
| Исходящие доставки в очереди | Очередь доставки SQLite | Обрабатываются после перезапуска; недоставленные ответы отправляются повторно |
| Запланированные задания (cron) | Хранилище cron в SQLite | Расписания сохраняются; планировщик повторно активируется при загрузке |
| Продолжение после перезапуска | Маркер перезапуска в SQLite | Однократное продолжение отправляется в сеанс, запросивший перезапуск |
Перед корректным перезапуском сначала завершается текущая работа
Запрошенный перезапуск (openclaw gateway restart, изменение конфигурации, требующее
перезапуска, или обновление Gateway) не прерывает выполняемую работу немедленно.
Gateway прекращает принимать новую работу, а затем ожидает завершения активных
ходов агентов и фоновых задач в пределах периода ожидания завершения (по
умолчанию 5 минут). Поэтому в большинстве случаев перезапуск вообще ничего не
прерывает.
Прерывается только работа, которую невозможно завершить в пределах периода ожидания (либо любой запуск, прерванный принудительным перезапуском или сбоем), — и перед этим каждый затронутый сеанс помечается для восстановления.
Как обнаруживается прерванная работа
Сеансы с незавершённым ходом помечаются тремя взаимодополняющими механизмами:
- При приёме запроса в Control UI: для обычного текстового хода в существующем
основном сеансе Gateway добавляет сообщение пользователя, помечает сеанс как
выполняющийся и записывает его заявку на доставку только расшифровки в одной
транзакции SQLite, прежде чем вернуть подтверждение
started. Команды, вложения, переопределения для отдельных ходов, ожидающие доставки, предыдущие признаки прерывания, сеансы, принадлежащие плагинам, и ходы с хуками выполнения сохраняют свои специализированные пути приёма. - При завершении работы: во время ожидания завершения перед перезапуском каждый сеанс с активным запуском получает в хранилище сеансов маркер восстановления, прежде чем запуск будет прерван.
- При запуске: Gateway сканирует хранилища сеансов на наличие сеансов, которые по-прежнему считаются выполняющимися, но не имеют активного владельца в новом процессе. Это позволяет обнаруживать аварийные завершения и принудительные остановки, при которых код завершения работы не выполнялся. Одновременно удаляются устаревшие файлы блокировки расшифровок.
Автоматическое возобновление
Через несколько секунд после запуска Gateway повторно отправляет каждый помеченный сеанс с синтетическим системным сообщением, которое уведомляет агента о том, что его предыдущий ход был прерван перезапуском, и предписывает продолжить работу на основе существующей расшифровки. Если итоговый ответ уже был сформирован, но не доставлен, его текст включается в сообщение, чтобы агент мог доставить его вместо повторного выполнения работы. Восстановление повторяется до 3 раз с экспоненциальной задержкой. При каждой попытке используется один и тот же постоянный идентификатор отправки, поэтому неоднозначный сбой подключения не может запустить одно и то же восстановление дважды. Для завершённых и невозобновляемых ходов Control UI также сохраняются ограниченные по сроку постоянные маркеры идемпотентности, позволяющие переподключившейся очереди исходящих сообщений снять их с обработки без повторного выполнения запроса.
Перед возобновлением Gateway проверяет, можно ли безопасно продолжить с конца расшифровки. Если нельзя (например, ход завершился на устаревшем ожидающем подтверждении), сеанс не запускается повторно вслепую; вместо этого агент публикует короткое уведомление с просьбой повторно отправить последний запрос. Для WebChat это уведомление записывается непосредственно в историю сеанса, чтобы оно оставалось видимым после переподключения.
OpenClaw также может восстанавливать прерванную работу Code Mode
только для чтения. Code Mode помечает такие запуски как безопасные при
перезапуске и отклоняет инструменты каталога или пространства имён плагинов с
побочными эффектами до их выполнения. Если перезапуск происходит на элементе
управления wait, новый Gateway восстанавливает ход по его
расшифровке и принудительно сохраняет безопасность восстановленного выполнения
при перезапуске, даже если модель пропускает или сбрасывает этот флаг. Хост
ограничивает весь восстановленный ход проверенными основными инструментами
только для чтения и явно безопасными для повторного выполнения инструментами
плагинов, в том числе если Code Mode отключён после перезапуска. Работа с
побочными эффектами остаётся защищённой уведомлением о повторной отправке,
чтобы исключить риск дублирующей записи.
Субагенты
Запуски субагентов сохраняются в общей базе данных состояния SQLite, поэтому реестр субагентов переживает перезапуск процесса. При загрузке реестр восстанавливается, а прерванные сеансы субагентов возобновляются с исходным контекстом задачи. Применяются два защитных механизма:
- Запуски, прерванные более 2 часов назад, завершаются вместо возобновления, чтобы Gateway, не работавший всю ночь, не возобновлял устаревшую работу.
- Сеанс, который неоднократно не удаётся восстановить, помечается постоянным маркером как зависший, чтобы восстановление не зацикливалось навсегда.
Фоновые задачи
Реестр фоновых задач использует SQLite и сверяется при загрузке, а также через заданные интервалы: постоянные результаты, записанные завершёнными запусками, восстанавливаются, а запуски, процесс-владелец которых исчез, после льготного периода помечаются как потерянные, а не остаются зависшими навсегда.
Перезапуски по запросу агента
Когда агент сам инициирует перезапуск (применяя изменение конфигурации, обновляя Gateway или явно запрашивая перезапуск), перед завершением процесса в SQLite записывается маркер перезапуска. После загрузки Gateway публикует результат в исходном чате и отправляет однократный ход продолжения, чтобы агент возобновил работу ровно с того места, где остановился, в том же канале и ветке.
Защитные механизмы и наблюдаемость
- Предохранитель от циклических сбоев: 3 некорректных загрузки в течение 5 минут активируют предохранитель, который при следующей загрузке подавляет автоматический запуск вспомогательных служб, чтобы сбойный Gateway не усугублял проблему. Нормальная работа восстанавливается после истечения окна некорректных загрузок.
- Метрики: сведения об активности восстановления экспортируются через
Prometheus как
openclaw_session_recovery_totalиopenclaw_session_recovery_age_seconds. - Журналы: решения о восстановлении записываются в журналы подсистем
main-session-restart-recoveryиsubagent-interrupted-resume.
Что не возобновляется
- Сеансы, исключённые из восстановления основных сеансов, поскольку ими уже управляет другой владелец: сеансы субагентов (восстановление субагентов), сеансы cron (планировщик повторно запускает их по расписанию) и сеансы под управлением ACP (за возобновление отвечает подключённая IDE или клиент).
- Сеансы, которые нельзя безопасно продолжить с конца расшифровки; вместо скрытого повторного запуска они получают описанное выше уведомление о повторной отправке.
- Работа, которая не была принята: сообщения, поступившие в период ожидания завершения, отклоняются с явной ошибкой перезапуска, а не молча добавляются в очередь завершающегося процесса.