Watchdog и самовосстановление
Проект упадёт — вопрос, как быстро он встанет и что увидит зал. Три уровня, heartbeat файлом, внешний watchdog с пределом перезапусков, состояние на диске и чего он не чинит.
Проект упадёт, и вопрос только в том, сколько до восстановления и что увидит зал.
Уровней три. Внутри проекта ошибка в одной ветке не роняет остальное:
try/except в колбэках, значения по умолчанию, рискованное в
отдельном процессе. Снаружи
watchdog следит, жив ли процесс, и поднимает его. И перезагрузка машины —
по расписанию и как крайняя мера.
def onFrameEnd(frame):
if frame % 60 == 0:
with open('D:/show/alive.txt', 'w') as f:
f.write(str(absTime.seconds))
return
Проект подаёт признак жизни — проще всего файлом раз в секунду, — а внешний скрипт смотрит на его возраст: старше 10 секунд — завис или упал. Можно и по OSC на вторую машину или в систему мониторинга.
раз в 30 секунд:
процесс TouchPlayer.exe существует? нет → запустить
alive.txt свежее 10 секунд? нет → убить и запустить
счётчик перезапусков за час < 5? нет → перезагрузить машину
Сам watchdog — PowerShell, Python или bat в планировщике, и последнее условие важно: бесконечный круг перезапусков хуже одной честной перезагрузки.
import json
def save_state(d):
with open('D:/show/state.json', 'w') as f:
json.dump(d, f)
После перезапуска шоу продолжается, а не начинается заново: состояние пишут на диск при каждом изменении и читают при старте — кью, мастер, режим. Шоу по таймкоду проще, там состояние считается из времени.
Пока проект встаёт, DMX не идёт, и многие узлы и приборы держат последнее значение — свет замирает. Инсталляции это терпимо, шоу — нет: резервная машина (Резерв) или дежурная картина, которую консоль держит независимо от вас.
Watchdog не починит ошибку в логике — перезапуск вернёт то же поведение; сеть — проект встанет и опять не увидит контроллеры; перегрев и усталость железа; полный диск. Поэтому его ставят в паре с мониторингом: watchdog поднимает проект, мониторинг показывает, что было. Порядок действий при отказе — Падение во время шоу.
Завершить процесс в диспетчере задач и засечь, когда всё вернулось. И так в разных состояниях шоу.
Нашли в статье ошибку, устаревшее или непонятное место?