Перезапустите приложение при необработанном исключении - PullRequest
5 голосов
/ 18 мая 2011

Возможно ли автоматическое перезапуск программы в случае сбоя?

Что-то вроде:

  1. Выдается необработанное исключение.
  2. Освободить все выделенные ресурсыпо процессу.
  3. Начните заново и вызовите main.

Мне бы хотелось, чтобы такое поведение выполнялось для серверного приложения, над которым я работаю.Если клиенты пропускают использование сервера, он может получить исключение std :: bac_alloc, и в этом случае я бы хотел, чтобы сервер просто перезагружался вместо сбоя и выключения, таким образом избегая ручного запуска.

Ответы [ 5 ]

6 голосов
/ 18 мая 2011

Я делал это раньше в Windows, запустив указанную программу из другой программы через вызов win32 CreateProcess .Затем другая программа ожидает завершения «отслеживаемого» процесса и снова вызывает его CreateProcess(), если это произойдет.Вы ожидаете завершения процесса, выполнив WaitForSingleObject для дескриптора процесса, который вы получаете как одно из возвращаемых значений из вашего CreateProcess() вызова.

Вы, конечно,каким-то образом запрограммировать отключение процесса мониторинга для себя и для дочернего процесса.

4 голосов
/ 18 мая 2011

Пусть Windows будет вашим сторожевым псом.Вы можете позвонить ChangeServiceConfig2, чтобы установить действия по отказу для вашей услуги.(Если ваш сервер не является службой, значит, вы делаете это неправильно.) Укажите SERVICE_CONFIG_FAILURE_ACTIONS для параметра dwInfoLevel, а в структуре SERVICE_FAILURE_ACTIONS установите lpsaActions намассив из одного или нескольких значений SC_ACTION.Тип, который вы хотите, это SC_ACTION_RESTART.

3 голосов
/ 18 мая 2011

Я сделал нечто подобное, реализовав сторожевой таймер. Сторожевая собака работала в качестве службы и ожидала пинга (называемого лаской собаки) из контролируемого процесса. Если отслеживаемый процесс завершится из-за исключительной ситуации, сторожевой таймер очистит и перезапустит приложение.

Если приложение не отвечает (в течение определенного времени не выполняется пинг), сторожевой таймер убивает его и затем перезапускает.

Вот ссылка на реализацию, которую вы можете использовать: http://www.codeproject.com/KB/security/WatchDog.aspx

(PS: я реализовал свою собственную версию, но я не могу опубликовать ее здесь. Я нашел ее по быстрому поиску в Google и не имею непосредственного опыта в этой конкретной реализации.)

1 голос
/ 18 мая 2011

Как @ T.E.D., Мы сделали это в приложении, которое мы создали. Наше приложение представляет собой службу Windows, поэтому вспомогательная программа останавливает службу (в конечном итоге, останавливает ее, если она зависает) и снова запускает службу.

1 голос
/ 18 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...