Как создать сервис, который перезапускается при сбое - PullRequest
12 голосов
/ 14 июля 2010

Я создаю сервис, используя CreateService.Служба будет снова работать нормально, если произойдет сбой, и я хотел бы, чтобы Windows перезапустила службу, если она выйдет из строя.Я знаю, что это можно настроить из служб msc, см. Ниже.

Windows Service Recovery Dialog

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

Ответы [ 3 ]

10 голосов
/ 21 ноября 2012

Использовал подход Дельтанина, но немного изменил его, чтобы иметь возможность контролировать каждое действие сбоя:

SERVICE_FAILURE_ACTIONS servFailActions;
SC_ACTION failActions[3];

failActions[0].Type = SC_ACTION_RESTART; //Failure action: Restart Service
failActions[0].Delay = 120000; //number of seconds to wait before performing failure action, in milliseconds = 2minutes
failActions[1].Type = SC_ACTION_RESTART;
failActions[1].Delay = 120000;
failActions[2].Type = SC_ACTION_NONE;
failActions[2].Delay = 120000;

servFailActions.dwResetPeriod = 86400; // Reset Failures Counter, in Seconds = 1day
servFailActions.lpCommand = NULL; //Command to perform due to service failure, not used
servFailActions.lpRebootMsg = NULL; //Message during rebooting computer due to service failure, not used
servFailActions.cActions = 3; // Number of failure action to manage
servFailActions.lpsaActions = failActions;

ChangeServiceConfig2(sc_service, SERVICE_CONFIG_FAILURE_ACTIONS, &servFailActions); //Apply above settings
8 голосов
/ 14 июля 2010

Вы хотите позвонить ChangeServiceConfig2 после установки службы. Установите второй параметр на SERVICE_CONFIG_FAILURE_ACTIONS и передайте экземпляр SERVICE_FAILURE_ACTIONS в качестве третьего параметра, что-то вроде этого:

int numBytes = sizeof(SERVICE_FAILURE_ACTIONS) + sizeof(SC_ACTION);
std::vector<char> buffer(numBytes);

SERVICE_FAILURE_ACTIONS *sfa = reinterpret_cast<SERVICE_FAILURE_ACTIONS *>(&buffer[0]);
sfa.dwResetPeriod = INFINITE;
sfa.cActions = 1;
sfa.lpsaActions[0].Type = SC_ACTION_RESTART;
sfa.lpsaActions[0].Delay = 5000; // wait 5 seconds before restarting

ChangeServiceConfig2(hService, SERVICE_CONFIG_FAILURE_ACTIONS, sfa);
4 голосов
/ 02 февраля 2011

Ответ выше даст вам суть ... но он не скомпилируется.

попробовать:

SERVICE_FAILURE_ACTIONS sfa;
SC_ACTION actions;

sfa.dwResetPeriod = INFINITE;
sfa.lpCommand = NULL;
sfa.lpRebootMsg = NULL;
sfa.cActions = 1;
sfa.lpsaActions = &actions;

sfa.lpsaActions[0].Type = SC_ACTION_RESTART;
sfa.lpsaActions[0].Delay = 5000; 

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