首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows服务启动:如何避免错误1053:服务没有及时响应启动或控制请求

Windows服务启动:如何避免错误1053:服务没有及时响应启动或控制请求
EN

Stack Overflow用户
提问于 2017-12-13 15:56:59
回答 2查看 9.6K关注 0票数 0

我有一个C++编写的Windows服务,在启动时,如果SERVICE_STATUS停留在SERVICE_START_PENDING中太长时间,我就会出现以下错误:

Error 1053: The service did not respond to the start or control request in a timely fashion

当保持打开进度栏对话框时会发生这种情况。它不影响服务启动本身。该服务将在SERVICE_START_PENDING中继续进行,直到工作完成并设置为SERVICE_RUNNING为止。

dwWaitHint上的Windows文档如下:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms685996(v=vs.85).aspx

SetServiceStatus时间过去之前,服务必须使用递增的dwCheckPoint调用dwWaitHint

例如,我将dwWaitHint设置为5分钟,每10秒用一个递增的dwCheckPoint调用SetServiceStatus,但5分钟后仍然会得到1053错误。换句话说,SetServiceStatus调用似乎什么都不做。(这些电话没有失败,我查过了)。

通过以上操作,服务启动时间不能超过dwWaitHint吗?

更新:我可以使用Microsoft的服务示例代码进行复制。这是一段片段。

代码语言:javascript
复制
{
    gSvcStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; 
    gSvcStatus.dwServiceSpecificExitCode = 0;    

    // Report initial status to the SCM
    ReportSvcStatus( SERVICE_START_PENDING, NO_ERROR, 300000 );

    int limit = 6;  // 6 minutes total
    while(limit--)
    {
        Sleep(60000); // sleep 1 min
        ReportSvcStatus( SERVICE_START_PENDING, NO_ERROR, 300000 );  // 5 minute dwWaitHint
    }

    // We've completed startup, report RUNNING to SCM
    ReportSvcStatus( SERVICE_RUNNING, NO_ERROR, 0 );

}

代码语言:javascript
复制
VOID ReportSvcStatus( DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwWaitHint)
{
    static DWORD dwCheckPoint = 1;

    // Fill in the SERVICE_STATUS structure.

    gSvcStatus.dwCurrentState = dwCurrentState;
    gSvcStatus.dwWin32ExitCode = dwWin32ExitCode;
    gSvcStatus.dwWaitHint = dwWaitHint;

    if (dwCurrentState == SERVICE_START_PENDING)
        gSvcStatus.dwControlsAccepted = 0;
    else gSvcStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;

    if ( (dwCurrentState == SERVICE_RUNNING) ||
           (dwCurrentState == SERVICE_STOPPED) )
        gSvcStatus.dwCheckPoint = 0;
    else gSvcStatus.dwCheckPoint = dwCheckPoint++;

    // Report the status of the service to the SCM.
    SetServiceStatus( gSvcStatusHandle, &gSvcStatus );
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-15 15:50:01

Microsoft管理控制台(MMC)服务插件有一定的限制,特别是这里的对话框:

请参阅MS的以下链接:

https://support.microsoft.com/en-ca/help/307806/the-services-snap-in-times-out-with-error-1053

启动任何控制操作时,“服务管理单元”将显示标题为“服务控制”的进度对话框。如果服务需要大量时间来处理操作,则进度条将随着服务插件等待操作完成而缓慢增加。125秒后,进度条将满,服务插件将显示错误1053 (ERROR_SERVICE_REQUEST_TIMEOUT)消息。即使在出现错误消息之后,服务流程本身仍将像往常一样继续其操作。

但是,有一点好消息是,我已经证明了这125秒语句是错误的,至少在Windows 10上是这样(还没有尝试其他Windows版本)。正如我在问题中所述,在设置SERVICE_START_PENDING时,可以将dwWaitHint设置为更高的值,而进度条将尊重这一点。但是,您只有1次机会,如果然后通过使用更高的SERVICE_START_PENDING调用SetServiceStatus来更新dwWaitHint,则不会影响进度条对话框。

设置dwWaitHint的唯一缺点是进度条会减慢,当您设置SERVICE_RUNNING状态时,进度条可能只是一半。但不是什么大事,只是审美而已。

票数 0
EN

Stack Overflow用户

发布于 2017-12-13 18:08:31

你确定你把dwWaitHint当作毫秒而不是秒?(也就是说你的dwWaitHint是300000?)

我的经验是,文档在这一点上是正确的,等待提示只适用于下一个SetServiceStatus调用。

尽管我也会说5分钟的服务启动时间太长了,即使加载或检查数据实际上要花那么长的时间。我之所以这么说,主要是因为服务控制接口一直被卡住。例如,即使在需要几个小时验证的系统崩溃之后,SQLServer也能相当快地启动服务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47797296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档