Когда Uniday Watchdog перезапускает приложение

Watchdog не гадает и не смотрит на картинку экрана. Он опрашивает процесс приложения по кругу и сверяет его с четырьмя правилами. Ниже — точные пороги, значения по умолчанию и то, что Watchdog при этом записывает: график памяти, архив логов приложения и собственный журнал.

Как поставить Watchdog на стенд и настроить эти пороги — Установка и настройка. Как раздавать новые версии билда — Обновление билда через Яндекс.Диск.

Цикл наблюдения

Watchdog работает тиками. На каждом тике он ищет процесс по имени, снимает показатели — PID, время работы, CPU, память, — проверяет время планового перезапуска и прогоняет правила перезапуска.

ПараметрПо умолчаниюГде настраивается
Интервал опроса10 секундНастройки → Мониторинг → «Интервал опроса (сек)»
Начальная задержка после запуска30 секундНастройки → Мониторинг → «Начальная задержка (сек)»

Начальная задержка — это «дайте приложению загрузиться»: в эти секунды проверки «не отвечает» и «зависание по CPU» не применяются, чтобы Watchdog не убил сборку во время долгой загрузки уровня.

Если приложение уже работает, когда Watchdog стартует — например, оно само прописано в автозапуске Windows, — второй экземпляр не запускается. Watchdog подхватывает работающий процесс и дальше следит за ним. Когда на машине несколько наблюдаемых приложений с одинаковым именем процесса, «своё» определяется по полному пути к exe.

Если процесс запущен с повышенными правами и его показатели прочитать нельзя, проверки «не отвечает» и «зависание по CPU» намеренно пропускаются: Watchdog не убивает то, что не может измерить.

Четыре причины перезапуска

  • Процесса нет
  • Окно не отвечает
  • Завис по процессору
  • Плановое время
Четыре повода для перезапуска
ПричинаКак Watchdog это видитНастройкаПо умолчанию
Приложения нетПроцесс с нужным именем не найденвсегда работает
Не отвечаетСистемный признак «процесс не реагирует» — то самое «Программа не отвечает»«Перезапускать при отсутствии ответа»включено
Завис по CPUСуммарное процессорное время процесса не изменилось вообще за окно проверки«Перезапускать при неизменном CPU (детект зависания)», «Окно проверки CPU (сек)»включено, окно 5 секунд
Плановое времяНаступило время ежедневного перезапуска«Ежедневный плановый перезапуск» + времявключено, 00:01

Правила проверяются по порядку, и первое сработавшее решает.

Приложения нет. Watchdog запускает его: путь к exe, рабочая папка (пусто = папка exe) и аргументы — из настроек приложения. Дальше начинается начальная задержка.

Не отвечает. Причина в журнале выглядит так: «PID 4812 не отвечает».

Завис по CPU — это «замороженный цикл»: приложение формально живо и даже «отвечает», но встало намертво и перестало потреблять процессорное время. Причина в журнале: «CPU процесса PID 4812 не изменился за 5 с». Сэмпл сбрасывается при смене процесса и при недоступных показателях — сравнение «через разрыв» не делается. Реальное окно сравнения не меньше заданного, но кратно интервалу опроса: проверка выполняется на тике.

Плановое время. Подробности и оговорки — в разделе ночной перезапуск.

Чего среди правил нет: Watchdog не следит за картинкой на экране и не определяет чёрный экран как таковой. Он видит только, есть ли процесс, отвечает ли он, тратит ли процессорное время и сколько ест памяти. Правил «перезапустить, если окно ушло с экрана» и «перезапустить, если лог не растёт N минут» в продукте нет.

Что будет, если приложение падает по кругу

Бесконечно перезапускать сборку, которая падает на старте, бессмысленно. Watchdog останавливается и зовёт человека.

ПараметрПо умолчаниюГде настраивается
Сколько перезапусков включают защиту3только в config.json, monitoring.crashLoopGuard.maxRestartsPerWindow
Окно, за которое они считаются5 минуттолько в config.json, monitoring.crashLoopGuard.windowMinutes

Когда порог набран: мониторинг блокируется, статус меняется на «Петля рестартов», в журнал идёт запись «петля рестартов: 3 перезапуска за 5 мин», а при включённой почте письмо уходит сразу, не дожидаясь сводки. Снимается только вручную — кнопкой ▶ / «Возобновить».

Что идёт в копилку, а что нет

СобытиеСчитается?
Сбой — ненулевой код возврата, при любом времени работыда
Принудительное завершение Watchdog при зависаниида
Процесс пропал между опросамида
Штатный выход с кодом 0 раньше 10 секунд после запускада — сборка, гаснущая на стартовой ошибке, это настоящая петля
Штатный выход после 10 секунд и больше — например, приложение закрыл человекнет
Перезапуск по команде операторанет
Плановый ночной перезапускда

Порог «10 секунд» зашит в продукт и в настройки не выносится. До версии 1.1.3 в копилку шёл каждый запуск подряд, включая ручное закрытие приложения, — с 28 августа 2026 это исправлено.

Пауза «петля рестартов» переживает перезапуск Watchdog: она записывается вместе с причиной. После перезагрузки стенд сам не поднимется, пока оператор не возобновит мониторинг — если только не включена галочка «Запускать мониторинг при старте Watchdog».

Что делать при этом статусе: разобрать причину по архиву логов приложения, починить билд, затем снять паузу кнопкой ▶.

График памяти процесса

Панель «Память процесса» на вкладке «Состояние» отвечает на вопрос «течёт ли память у билда» числом, а не ощущением.

График памяти процесса в Uniday Watchdog: тренд, маркер сбоя, подсказка
Утечка видна как тренд, а не как жалоба посетителя

Что меряется. Две линии, снимаются на каждом тике:

  • Private bytes — основная: «личная» закоммиченная память процесса, на ней утечка не маскируется;
  • Working set — вторичная: физическая память процесса вместе с общими библиотеками, то же число, что показывает диспетчер задач.

Складывать их нельзя — это два взгляда на одну память.

Тренд. В шапке панели — текущее значение private крупно и наклон за текущий сеанс: ↗ +38 МБ/ч за сеанс, ↘ −38 МБ/ч за сеанс или → стабильно за сеанс, если наклон меньше 1 МБ/ч в любую сторону.

Диапазоны. Час · Сутки · Неделя · Всё. По умолчанию — Сутки, выбор запоминается. «Час» рисует сырые тики; «Сутки» и шире — линию средних с полупрозрачным коридором минимума и максимума.

Маркеры — вертикальный пунктир: выход процесса (красный при сбое, серый при штатном или ручном завершении, в подсказке — время и причина) и установка новой версии билда («обновление до 1.4.3»).

Подсказка при наведении показывает 14:32 · Private: 2,4 ГБ · Working set: 2,1 ГБ и строку Билд: 1.2.3. На агрегатах значения выводятся как «среднее (мин–макс)». Над разрывом линии подпись «процесс не работал». На сенсорном экране тап работает как наведение.

Где хранится:

УровеньЧтоГоризонт
Оперативная памятьсырые тики2 часа, до 8192 точек
Дискпоминутные значения мин/среднее/макс по обеим линиям, файл projects\<id>\metrics\memory-ГГГГ-ММ.csv60 дней, старые файлы удаляются сами

В каждой строке CSV есть колонка с версией билда, активной в момент замера. Файл годится как выгрузка «как есть» — открывается в Excel и любом редакторе таблиц.

Кнопка «Очистить» справа от диапазонов удаляет буфер и CSV только своей вкладки и спрашивает подтверждение «Удалить всю историю памяти?». Сбор продолжается со следующего тика.

Чего панель не делает: порога-алерта по памяти нет, письма при превышении не приходит, автоматически по памяти Watchdog не перезапускает. График показывает — решение принимает человек. Панели CPU тоже нет.

Простой процесса рисуется разрывом линии, а не прямой через даунтайм. Наблюдение продолжается и когда мониторинг стоит на паузе.

Архив логов приложения и причины завершения

Каждый раз, когда приложение завершается, его лог-файл сохраняется отдельной копией с проставленной причиной. Получается готовый багрепорт для разработчика билда.

Вкладка «Логи приложения»: список архивов с причинами завершения
Лог каждого сеанса с причиной завершения

Откуда берётся лог. Для Unity путь определяется автоматически: %USERPROFILE%\AppData\LocalLow\<Компания>\<Продукт>\Player.log. Для Unreal — свежайший *.log из папки Saved/Logs проекта рядом с exe. Для типа «Другое» автоопределения нет: путь указывается вручную или оставляется пустым.

Как называется копия. <Процесс>_ГГГГ-ММ-ДД_ЧЧ-ММ-СС_<причина>.log в папке projects\<id>\target-logs\. Рядом ложится парный файл с метаданными: процесс, время запуска и выхода, причина, код выхода, размер, признак обрезки.

Причины завершения — так они подписаны в таблице:

ПодписьЧто означает
Штатное завершениеПроцесс вышел сам с кодом 0: приложение закрыли или оно завершилось корректно. Watchdog не вмешивался
СбойПроцесс упал с ненулевым кодом возврата — например, 0xC0000005 (обращение к чужой памяти) или переполнение стека. В скобках — краткая причина, если её удалось определить
Перезапуск watchdogWatchdog принудительно завершил процесс: зависание, плановый перезапуск или остановка из интерфейса. Конкретный повод — в скобках
Ручное завершениеОстановка оператором
НеизвестноПроцесс пропал между опросами: внешнее завершение, taskkill, перезагрузка машины

Большие логи обрезаются. Если исходный файл больше 5 МБ, сохраняется хвост, а в начало вставляется строка === TRUNCATED — пропущено N байт исходного файла (…) ===. В таблице размер показывается как 1,2 МБ (обрезано из 48,3 МБ).

Ротация архива: до 50 файлов и не старше 30 дней. Лимиты общие для всего Watchdog, но применяются к папке каждой вкладки отдельно. Вся функция выключается в config.json (logging.logArchive.enabled), в интерфейсе выключателя нет.

Что на вкладке «Логи приложения»:

  • карточка «Текущий лог»: статус («Активен», «Файл ещё не создан», «Процесс не запущен»), полный путь, «Изменён», «Размер» и три иконки — открыть лог, открыть папку, отправить по почте;
  • таблица «Архив логов целевого приложения»: Имя файла · Дата завершения · Причина · Код выхода, кнопка «Обновить», в контекстном меню строки — «Открыть» и «Отправить…».

Архив ведётся и когда мониторинг стоит на паузе. Если путь к логу не задан или файла нет, архивация просто не работает — ошибок пользователю не показывается.

Как переслать лог разработчику из окна — в разделе отправить лог.

Журнал Watchdog

Логов три, у каждого своя роль.

ФайлЧто внутриДля кого
logs\watchdog.logСобытия: запуск, перезапуск, зависание, плановый перезапуск. Один файл на всю папку; строки вкладки идут с префиксом [<имя вкладки>]Оператор, разбор постфактум
logs\diagnostic.logВнутренние предупреждения и ошибкиРазбор проблем самого Watchdog
logs\crashes\crash_*.logСбои самого WatchdogОтправка разработчику

Живая лента — вкладка «Логи watchdog»: последние записи (до 1000) с колонкой уровня. События, не привязанные к конкретному приложению — настройки, почта, самообновление, — видны во всех вкладках с пометкой «Watchdog». Над лентой две иконки: открыть полный лог на диске и отправить журнал по почте (вторая активна только при настроенной почте).

Уровень журнала, размер файла до ротации и число хранимых файлов настраиваются только в config.json (logging.level — «Information», maxSizeMb — 10, rotatedFiles — 5). Экспорта «диагностического архива» одной кнопкой пока нет.

Экземпляры, запущенные мимо Watchdog

Отдельная опция закрывает лазейку «оператор поставил мониторинг на паузу и запустил билд руками».

«Завершать экземпляры приложения, запущенные мимо Watchdog» — Настройки → Мониторинг, по умолчанию выключено.

Когда включено, экземпляры целевого приложения, запущенные не через Watchdog — вручную из папки, ярлыком, автозапуском Windows, — завершаются на ближайшем цикле проверки. Окно Watchdog разворачивается и показывает отдельное окно «Watchdog — Посторонний запуск» поверх всего, в том числе поверх полноэкранного билда: процесс, PID, путь, время и счётчик «Повторных срабатываний: N». Окно единственное — повторы обновляют счётчик, а не плодят стопку окон.

Что важно знать:

  • опция работает всё время, пока Watchdog запущен, — в том числе когда мониторинг стоит на паузе;
  • исключения: подмена билда обновлением и блокировка «цель занята другим Watchdog» — там посторонние не ищутся;
  • одноимённый процесс с чужим путём к exe не трогается. Если такой процесс держит другой живой Watchdog, его тоже не трогают — иначе две копии устроили бы войну «убил — перезапустил»;
  • единственный способ запустить приложение в обход — полностью закрыть Watchdog (значок в трее → «Выход»);
  • осознанный компромисс: если Watchdog перезапустится, пока мониторинг на паузе, уже работающее приложение он не отличит от постороннего и завершит. Перед перезапуском Watchdog снимайте паузу или временно выключайте опцию;
  • если завершить посторонний процесс не удалось (например, не хватило прав), окно покажет это красным акцентом — процесс всё ещё работает.

Статусы

ПодписьЦветЧто означает
РаботаетзелёныйПроцесс найден и здоров
ЗапускаетсяжёлтыйЗапуск в процессе
ПерезапускжёлтыйИдёт перезапуск
Не отвечаеткрасныйПроцесс не реагирует
ОшибкакрасныйСбой в работе наблюдения
Петля рестартовкрасныйСработала защита от петли, мониторинг заблокирован
Конфликт целикрасныйЦель уже наблюдается другим приложением или экземпляром Watchdog
ПаузасерыйМониторинг приостановлен
ОстановленсерыйНаблюдение не ведётся

В трее при нескольких вкладках показывается худший статус, порядок «худшести»: Ошибка → Предупреждение → Пауза → Работает → Остановлен.

Главное окно Uniday Watchdog: статус, счётчики перезапусков, график памяти
Вкладка «Состояние»: всё главное на одном экране

Что где лежит на диске

D:\Stands\Chess\
  Watchdog.exe
  config.json
  logs\
    watchdog.log
    diagnostic.log
    crashes\
  projects\<id>\
    metrics\memory-2026-09.csv     история памяти, 60 дней
    target-logs\                   архив логов приложения, 50 файлов / 30 дней
    update-state.json              состояние обновлений этого приложения
  builds\<id>\
    Chess-1.4.2-9f86d0\            предыдущая версия, для отката
    Chess-1.4.3-a1b2c3\            текущая
    .staging\                      скачивание и распаковка

Идентификатор <id> — служебный, в интерфейсе он не виден: имя и путь приложения меняются, а идентификатор нет. Всё, что лежит внутри папки Watchdog, переезжает вместе с ней на другой компьютер — см. перенос папки.

Основные значения по умолчанию

Окно настроек Uniday Watchdog, вкладка «Мониторинг»: пороги и чекбоксы
Все пороги мониторинга — на одной вкладке настроек

Быстрый справочник по полям config.json. Файл лежит рядом с exe и читается на лету: правка руками подхватывается без перезапуска.

ПолеПо умолчаниюЕсть в интерфейсе
monitoring.pollingIntervalSeconds10да
monitoring.initialDelaySeconds30да
monitoring.checkRespondingвключенода
monitoring.hangCpuCheck.enabledвключенода
monitoring.hangCpuCheck.sampleWindowSeconds5да
monitoring.killRogueProcessesвыключенода
monitoring.crashLoopGuard.maxRestartsPerWindow3нет
monitoring.crashLoopGuard.windowMinutes5нет
schedule.dailyRestartEnabledвключенода
schedule.time00:01да
startup.launchWithWindowsвыключенода
startup.forceMonitoringвыключенода
ui.startMinimizedвключенода
ui.minimizeOnTargetStartвключенода
ui.memoryChartRangeDayда, вкладки диапазонов
logging.logArchive.maxFiles50нет
logging.logArchive.maxAgeDays30нет
logging.logArchive.maxFileSizeMb5нет
notifications.email.smtp.port587да
notifications.email.digest.intervalDays7да
notifications.email.digest.dispatchTime09:00да

Поля, которые есть в файле, но ни на что не влияют: startup.runAsAdmin и monitoring.hangLogFreshness.* — зарезервированы, поведения не меняют. Чекбокс «Очищать журнал watchdog при плановом перезапуске» сохраняется, но на журнал не действует.

Настройки, записанные более новой версией Watchdog, он не перезаписывает: при несовпадении схемы программа завершится, а причина уйдёт в diagnostic.log. Лечится обновлением Watchdog до актуальной версии.

Дальше

© UNIDAY, 2014-2025

ООО «Юнидэй»
г. Саратов, ул. Бахметьевская 44/64, оф. 72
ИНН: 6454142737
КПП: 645401001
ОКВЭД: 62.01 Разработка компьютерного программного обеспечения.
Код вида деятельности: 22.01