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;
答案 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();
....