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 идёт в паре с мониторингом: он поднимает, а мониторинг рассказывает, что происходило. Порядок действий в момент отказа — Падение во время шоу.
Завершите процесс из диспетчера задач и засеките, через сколько всё вернулось. Проверьте это же в разных состояниях шоу.