Как перезагрузить сбойный процесс в Windows? Конечно, я могу запустить пользовательский процесс службы Win для мониторинга. Но, например, Firefox: похоже, он не устанавливает такую вещь, но все же может перезапускаться при сбое.
Как перезагрузить сбойный процесс в Windows
Ответы (4)
В Vista и более поздних версиях вы можете использовать RegisterApplicationRestart API для автоматического перезапуска когда он вылетает или зависает.
До Vista у вас должен был быть фильтр исключений верхнего уровня, который будет выполнять перезапуск, но имейте в виду, что выполнение кода внутри скомпрометированного процесса не совсем безопасно и надежно.
Firefox постоянно сохраняет свое состояние на жесткий диск каждый раз, когда вы открываете вкладку, щелкаете ссылку или выполняете какое-либо другое действие. Он также сохраняет отметку о безопасном завершении работы.
При запуске он считывает все это обратно и может «восстанавливать» на основе этой информации.
Структурированная обработка исключений (SEH) позволяет ловить сбои программы и делать что-нибудь, когда это происходит.
См. __try and __except
SEH может быть очень опасным и вместо этого может привести к зависанию вашей программы. Дополнительную информацию см. В этой статье.Если вы пишете свою программу как службу NT, вы можете установить первое, второе и последующие действия при сбое на «Перезапустить службу».
Для сервера Windows 2008, Windows Vista и Windows 7 вы можете использовать Win32 API RegisterApplicationRestart
См. мой ответ здесь для получения дополнительной информации о работе с различными типами сбоев программ.
Если я правильно помню, Windows реализует по крайней мере какое-то подмножество POSIX и поэтому «должна» иметь интерфейс сигналов (такие как SIGKILL, SIGSEGV, SIGQUIT и т. Д.).
Я никогда не делал этого, кроме Linux, но вы можете попробовать установить ловушку неожиданного завершения с помощью signal () (signal.h). При быстром просмотре документов кажется, что при обработке сигнала можно сделать очень мало вещей, возможно, даже запуск нового процесса находится в запрещенном списке.
Теперь, когда я подумал об этом, я бы, вероятно, выбрал шаблон master / worker, очень простой родительский поток, который ничего не делает, кроме порождает worker (который выполняет все UI / другие вещи). Если он не устанавливает конкретный бит «Я сейчас умру», но все равно умирает (родительский процесс всегда получает сообщение / уведомление о том, что порожденный процесс умер), тогда мастер возрождает воркера. Основная тема - держать мастера очень просто и трудно умереть из-за собственных ошибок.