[英]Windows Service not starting on cold boot
Windows並非總是以冷啟動的方式啟動我的服務,但是Windows總是一次又一次無法啟動,並在系統日志中顯示“已達到超時”錯誤。
我在服務開始時添加了一行代碼來轉儲時間,以查看發生了什么。
大約15次關機並重新啟動后,我的服務終於沒有啟動。
在應用程序事件日志中,我在8:18:29看到Windows許可證驗證事件,並且WMI在8:19:04開始,但是當我查看日志文件時,我看到的是'08:15:21:_tmain'
這意味着我的服務甚至在重新啟動時都沒有加載,或者至少沒有調用“ main”。
查看系統事件日志:我在8:18:57看到事件7009:在等待XXXX服務連接時達到了超時(30000毫秒)。
在“ HKLM \\ System \\ CurrentControlSet \\ Control”的注冊表中,我將“ ServicesPipeTimeout”的值設置為90000
我的服務可執行文件是基於.Net 2.0的C ++,帶有/ clr支持,該可執行文件也未簽名,我添加了
<generatePublisherEvidence enabled="false"/>
可以確定。
該服務取決於事件日志,該事件日志顯然可以正常工作。
這是Windows 7 x64 VM,具有4GB的內存和很少的內存,但在啟動時似乎會跳動,並且難以建立網絡連接。
如果我手動啟動該服務,它將在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;
在啟動過程中可能會出現競爭狀況。 如果事件日志在系統嘗試啟動您的服務之前尚未開始工作,並且對該日志有依賴性,則可能會導致您的服務失敗。
也許您可以相對於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();
....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.