Windows服务无法在冷启动时启动

时间:2015-06-03 13:59:47

标签: .net windows visual-c++ windows-services

Windows并不总是在冷启动时启动我的服务,大部分时间都是这样,但是系统日志中出现“超时已到达”错误时,它不时会出现错误。

我在服务一开始就添加了一行来转储时间,看看发生了什么。

大约15次关机并重新启动后,我的服务终于没有启动。

查看应用程序事件日志,我在8:18:29看到Windows License Validated事件,WMI从8:19:04开始 但是当我看到我的日志文件时,我看到了     '08:15:21:_tmain'

这意味着我的服务甚至没有在重新启动时加载,或者至少没有调用'main'。

查看系统事件日志: 我在8:18:57看到事件7009:等待XXXX服务连接时达到超时(30000毫秒)。

在'HKLM \ System \ CurrentControlSet \ Control'的注册表中,我将值'ServicesPipeTimeout'设置为90000

我的服务可执行文件是C ++,基于.Net 2.0支持/ clr 可执行文件也没有签名,我已经添加了

<generatePublisherEvidence enabled="false"/>

到.config文件,只是为了确定。

该服务取决于事件日志,这显然有效。

这是具有4GB内存的Windows 7 x64虚拟机,但在启动时似乎确实发生了颠簸并且无法获得网络连接。

如果我手动启动服务,它会在5秒内启动。

我不想让服务'自动(延迟启动),因为这种情况发生在Windows启动后2分钟。

我不知道接下来要尝试什么,甚至不知道在哪里看。

非常感谢任何指导。

谢谢。

[编辑] 这是我的代码的输入。请注意,在我对服务做任何事情之前,我正在写日志,这些都在MyService类中。

int _tmain(int /*argc*/, TCHAR* /*argv*/[], TCHAR* /*envp*/[])
{
 SaveStringToFile(L"C:\\start.txt",  CTime::GetCurrentTime().Format("%H:%M:%S") + L": _tmain\n");
 SetUnhandledExceptionFilter( MyCustomFilter ); 
 OutputDebugString(_T(__FUNCTION__));
 CMyService Service;

1 个答案:

答案 0 :(得分:1)

启动时可能会出现竞争状况。如果在系统尝试启动服务之前事件日志尚未开始工作,并且该日志存在依赖关系,则可能导致服务失败。

也许您可以 Change the order in which your service application is started with respect to the Log

编辑 以添加评论信息

根据我的经验,如果在初始化期间进行太多操作,则无法启动服务可执行文件存在真正的危险。我只放入了必需品。在这种情况下,写入日志:(还包括main和ServiceMain()的片段,以说明我之前提到的异常日志记录...)

////////////////////////////////////////////////////////    
//  
//  InitService(void)  - Service initialization
//
//  Caution - limit what is done from this function.
//  The service start function: SVC_ServiceStart()
//  is limited in how much time can be allocated  
//  to start this executable before it times out.   
//  
////////////////////////////////////////////////////////    
int InitService(void)
{
    char buf[200];

    sprintf(buf, "Monitoring started");
    if(LOG_STRTSTOP==1)WriteToLog(buf);

    return SVC_SUCCESS;
}

其中 我的main()和ServiceMain()如下所示:

void main()
{
    SERVICE_TABLE_ENTRY ServiceTable[2];
    ServiceTable[0].lpServiceName = "xyzMon";
    ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;

    ServiceTable[1].lpServiceName = NULL;
    ServiceTable[1].lpServiceProc = NULL;
    // Start the control dispatcher thread for our service
    StartServiceCtrlDispatcher(ServiceTable);
    LogProgramFlow("Leaving main()");
}

void ServiceMain(int argc, char** argv)
{
    int error, result;

    pS = &s;

    ServiceStatus.dwServiceType             = SERVICE_WIN32;
    ServiceStatus.dwCurrentState            = SERVICE_START_PENDING;
    ServiceStatus.dwControlsAccepted        = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
    ServiceStatus.dwWin32ExitCode           = 0;
    ServiceStatus.dwServiceSpecificExitCode = 0;
    ServiceStatus.dwCheckPoint              = 0;
    ServiceStatus.dwWaitHint                = 3000;


    hStatus = RegisterServiceCtrlHandler( "xyzMon", (LPHANDLER_FUNCTION)ControlHandler);
    if (hStatus == (SERVICE_STATUS_HANDLE)0)
    {
        // Registering Control Handler failed
        if(LOG_ERR==1) WriteToLog("Registering Control Handler failed");

        return;
    }
    // Initialize Service
    error = InitService();
    ....