簡體   English   中英

我可以在一個Windows服務中托管多個不同的Windows服務嗎?

[英]Can I host multiple different windows services in a single windows service?

我有一堆舊版Windows服務。 所有這些服務都安裝在多台服務器上,但是由於某些原因,該服務可能已關閉,例如內存泄漏,文件系統異常和sql連接異常。 因此,我們必須遠程處理服務器並每天檢查服務狀態。 盡管添加了還原操作。 但是它仍然不是健壯的,可控制的。

我想找到的解決方案是,將所有這些現有服務集成到一個Windows服務中。 該主機服務可以運行子服務並對其進行計划和監視,當發生錯誤時,我的主機服務可以還原,將錯誤記錄到數據庫並向相關人員發送電子郵件。 該解決方案還可以使我調度服務,例如stop,定期設置。 因此,我想知道有沒有一種方法不需要修改從服務庫繼承的現有Windows服務的程序集並將它們集成到我的框架中。 我以為OS可以托管子服務,所以我的Host服務或框架必須也可以托管子服務並安排它們。

我的最終目標是只有一個Windows服務,這是我的主機服務。 其他子服務在我的服務下運行,而未安裝到操作系統。

我在下面挖了一些相關的主題,但是它們不符合我的要求:

當您說服務時,是指適當的服務或將可執行文件轉換為服務? 如果是后者,則可以完全控制它。 您可以將子服務生成為線程甚至進程。 最大的問題是取消流程。 在Windows OS的每個新發行版中,它們都添加了越來越多的安全功能,這使得很難終止進程。

線程可能是一個問題,因為如果一個線程由於內存泄漏而死亡,則會影響程序。 整個程序可能必須殺死自己並重新啟動。

警告說明:服務以名為“本地用戶”的用戶身份運行。 您無法以“本地用戶”身份登錄,甚至無法以最高管理員(稱為管理員)身份登錄,也無法終止“本地用戶”服務或進程。 只有“本地用戶”才能殺死他們。

您是否看過諸如firedaemon之類的共享軟件產品? 他們做類似的事情。

所以我想知道有沒有一種方法不需要修改從服務庫繼承的現有Windows服務的程序集並將它們集成到我的框架中

聽起來您不想修改現有代碼,所以到目前為止,最簡單,最有效的解決方案是編寫一個監視其他服務的單獨服務。

ServiceController類包含檢查其他服務的狀態所需的所有功能,而無需訴諸sc或其他實用程序調用。

您可以維護.txt文件或.xml文件,其中包含要監視的服務列表。

string[] servicesToWatch = GetServiceList();
foreach (string service in servicesToWatch)
{
    try
    {
        ServiceController sc = new ServiceController(service);
        if (sc.Status != ServiceStatus.Running)
        {
            sc.Start();
            sc.WaitForStatus(ServiceStatus.Running, TimeSpan.FromMinutes(2));
            // log to database that service was restarted
        }
    }
    catch (Exception e)
    {
        // log to database that service could not be started
        // send emails to necessary people
    }
}

然后,您可以將上述代碼放入計時器或while循環中,每隔x分鍾檢查一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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