Как перезагрузить сбойный процесс в Windows

Как перезагрузить сбойный процесс в Windows? Конечно, я могу запустить пользовательский процесс службы Win для мониторинга. Но, например, Firefox: похоже, он не устанавливает такую ​​вещь, но все же может перезапускаться при сбое.


person Community    schedule 21.03.2009    source источник
comment
Как это точно не связано с программированием?   -  person Ed S.    schedule 21.03.2009
comment
@Mitch: Да, я также хотел бы получить некоторые разъяснения по этому поводу.   -  person Dirk Vollmar    schedule 21.03.2009


Ответы (4)


В Vista и более поздних версиях вы можете использовать RegisterApplicationRestart API для автоматического перезапуска когда он вылетает или зависает.

До Vista у вас должен был быть фильтр исключений верхнего уровня, который будет выполнять перезапуск, но имейте в виду, что выполнение кода внутри скомпрометированного процесса не совсем безопасно и надежно.

person Michael    schedule 21.03.2009

Firefox постоянно сохраняет свое состояние на жесткий диск каждый раз, когда вы открываете вкладку, щелкаете ссылку или выполняете какое-либо другое действие. Он также сохраняет отметку о безопасном завершении работы.

При запуске он считывает все это обратно и может «восстанавливать» на основе этой информации.

person zildjohn01    schedule 21.03.2009

  • Структурированная обработка исключений (SEH) позволяет ловить сбои программы и делать что-нибудь, когда это происходит.
    См. __try and __except
    SEH может быть очень опасным и вместо этого может привести к зависанию вашей программы. Дополнительную информацию см. В этой статье.

  • Если вы пишете свою программу как службу NT, вы можете установить первое, второе и последующие действия при сбое на «Перезапустить службу».

  • Для сервера Windows 2008, Windows Vista и Windows 7 вы можете использовать Win32 API RegisterApplicationRestart

См. мой ответ здесь для получения дополнительной информации о работе с различными типами сбоев программ.

person Brian R. Bondy    schedule 21.03.2009

Если я правильно помню, Windows реализует по крайней мере какое-то подмножество POSIX и поэтому «должна» иметь интерфейс сигналов (такие как SIGKILL, SIGSEGV, SIGQUIT и т. Д.).

Я никогда не делал этого, кроме Linux, но вы можете попробовать установить ловушку неожиданного завершения с помощью signal () (signal.h). При быстром просмотре документов кажется, что при обработке сигнала можно сделать очень мало вещей, возможно, даже запуск нового процесса находится в запрещенном списке.

Теперь, когда я подумал об этом, я бы, вероятно, выбрал шаблон master / worker, очень простой родительский поток, который ничего не делает, кроме порождает worker (который выполняет все UI / другие вещи). Если он не устанавливает конкретный бит «Я сейчас умру», но все равно умирает (родительский процесс всегда получает сообщение / уведомление о том, что порожденный процесс умер), тогда мастер возрождает воркера. Основная тема - держать мастера очень просто и трудно умереть из-за собственных ошибок.

person Pasi Savolainen    schedule 21.03.2009