我正在使用CreateService
创build一个服务。 该服务将再次正常运行,如果它发生崩溃,我想有Windows重新启动服务,如果它崩溃。 我知道这是可能的,从服务MSC设置了下面。
如何以编程方式将服务configuration为在发生崩溃时始终重新启动。
您想要在安装服务后调用ChangeServiceConfig2 。 将第二个参数设置为SERVICE_CONFIG_FAILURE_ACTIONS
并传入SERVICE_CONFIG_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);
使用了Deltanine的方法,但修改了一下能够控制每个失败的行为:
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
上面的答案会给你的要点,但它不会编译。
尝试:
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)