2009-12-30 114 views
2

我想做一個Windows服務,監視另一個Windows服務,並確保它正在工作。 有時我想看的Win服務留在內存中(出現在任務管理器中,所以它被認爲是一個正在運行的服務,但事實是它什麼都不做,它已經死了,它的計時器不會因爲某種原因而被解僱,這不是這個問題的主題)。看門狗贏得服務觀看另一個贏得服務

我需要做的是製作一個看門狗Win服務,以某種方式讀取其他服務定期寫入的內存值。 我想過使用命名管道,但我不想添加通信問題到我的服務,我想知道是否有辦法在2個應用程序之間創建這樣的共享內存(可能使用命名系統寬度的互斥量?)

+0

什麼要看您的看門狗服務? – 2009-12-30 14:58:05

+0

看門狗將非常簡單,它也不太可能卡住 – 2010-01-05 07:51:19

回答

2

既然你必須處理檢測殭屍服務,我不認爲使用像互斥這樣的內核對象會有所幫助,你需要檢測活動。信號量也不太合適。

我個人的偏好是發送小心跳消息的命名管道(因爲它也可以在網絡中檢測到),但是如果你想避免管道通信的複雜性 - 我想這是可以理解的 - 那麼你可以更新預定註冊表項中的DWORD。如果兩個服務都在LocalSystem下運行,您可以將一個鍵/值寫入HKEY_LOCAL_MACHINE。運行一個泵送計時器並且每隔一段時間觀察一次鑰匙的變化(注意計數器環繞)。您不會有正常的窗口/消息泵,因此SetTimer處於禁用狀態,但您仍然可以使用timeSetEvent或等待定時器。

如果其中一項服務在非管理帳戶下運行,HKLM將不可用,但這對於服務來說是非常罕見的情況。當然,所有這些都假定你可以訪問這兩種服務的代碼。觀看第三方服務會嚴重限制您的選擇。