How to create service which restarts on crash

后端 未结 3 1410
耶瑟儿~
耶瑟儿~ 2021-02-13 21:06

I am creating a service using CreateService. The service will run again fine if it happens to crash and I would like to have Windows restart the service if it crashes. I know it

相关标签:
3条回答
  • 2021-02-13 21:17

    Used Deltanine's approach, but modified it a bit to be able to control each failure action:

    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
    
    0 讨论(0)
  • 2021-02-13 21:17

    The answer above will give you the gist... but it wont compile.

    try:

    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)
    
    0 讨论(0)
  • 2021-02-13 21:28

    You want to call ChangeServiceConfig2 after you've installed the service. Set the second parameter to SERVICE_CONFIG_FAILURE_ACTIONS and pass in an instance of SERVICE_FAILURE_ACTIONS as the third parameter, something like this:

    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);
    
    0 讨论(0)
提交回复
热议问题