К содержанию
fohbook/ TouchDesigner для света
профи

Watchdog и самовосстановление

Проект упал или завис — что должно произойти дальше и как это сделать без внешних сервисов.

Проект упадёт. Вопрос в том, сколько времени пройдёт до восстановления и что увидит зал.

Три уровня

1. Восстановление внутри проекта. Ошибка в ветке не должна ломать остальное: try/except в колбэках, значения по умолчанию, изоляция рискованного в отдельный процесс.

2. Перезапуск процесса. Внешний watchdog следит, что проект жив, и поднимает его.

3. Перезагрузка машины. По расписанию и как крайняя мера.

Heartbeat

Проект должен подавать признак жизни. Простейший вариант — писать файл раз в секунду:

def onFrameEnd(frame):
    if frame % 60 == 0:
        with open('D:/show/alive.txt', 'w') as f:
            f.write(str(absTime.seconds))
    return

Внешний скрипт проверяет возраст файла: старше 10 секунд — проект завис или упал.

Вариант поинтереснее: heartbeat уходит по OSC на вторую машину или в систему мониторинга.

Внешний watchdog

Скрипт на PowerShell, Python или bat-файл в планировщике:

раз в 30 секунд:
    процесс TouchPlayer.exe существует?  нет → запустить
    alive.txt свежее 10 секунд?          нет → убить и запустить
    счётчик перезапусков за час < 5?     нет → перезагрузить машину

Последнее условие важно: бесконечный цикл перезапуска хуже, чем один честный перезапуск машины.

Восстановление состояния

После перезапуска шоу должно продолжиться, а не начаться заново. Сохраняйте состояние на диск при каждом изменении:

import json
def save_state(d):
    with open('D:/show/state.json', 'w') as f:
        json.dump(d, f)

При старте — прочитать и восстановить: текущее кью, мастер, режим. Если шоу идёт по таймкоду, восстановление проще: состояние считается из текущего времени.

Что видит зал

Перезапуск занимает секунды — заполните их

Приборы держат последнее значение, то есть замирают. Для инсталляции это приемлемо; для шоу — нет. Варианты: резервная машина (Резерв) или дежурная картина света, которую держит консоль независимо от вас.

Чего watchdog не чинит

  • Ошибку в логике: перезапуск вернёт то же самое поведение.
  • Проблему сети: проект поднимется и снова не увидит контроллеры.
  • Перегрев и деградацию железа.
  • Заполненный диск.

Поэтому watchdog идёт в паре с мониторингом: он поднимает, а мониторинг рассказывает, что происходило. Порядок действий в момент отказа — Падение во время шоу.

Проверьте watchdog принудительным убийством

Завершите процесс из диспетчера задач и засеките, через сколько всё вернулось. Проверьте это же в разных состояниях шоу.

рядом по смыслу