簡體   English   中英

Windows服務無法在冷啟動時啟動

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM