2009-07-30 54 views
1

有誰知道檢測遠程應用程序是否發生故障/崩潰的方法?當它變得不可用時,我意思是 - 在這種情況下,您通常會在標題欄中看到「Not Responding」 - 但關鍵是應用程序仍在運行;因此只找到不再運行的流程是不夠的。C#檢測遠程應用程序故障

WMI不支持在遠程機器上使用System.Diagnostics.Process.Responding ..並且它們似乎不是我可以在Win32_Process中爲這類信息查詢的其他WMI屬性。

回答

0

在確定項目的「活躍度」是衡量這方面的定義它以有用的方式活着是很重要的。

幾個簡單的「代理」的方法是由於其簡單膚淺的吸引力,但根本不衡量的重要方面。

也許最常見的是「隨機過程是活着」和「單獨的心跳廣播線程」可能是因爲它是如此簡單的事情:

bool keepSending = true; // set this to false to shut down the thread 
var hb = new Thread(() => 
    { 
     while (true) 
      SendHeartbeatMessage(); 
    }).Start(); 

這兩但是有一個嚴重的缺陷,如果你的應用程序中的實際工作線程鎖定(例如進入無限循環或死鎖),然後你將繼續愉快地發送OK消息。對於基於流程的監控,儘管不再執行真正的任務,但您仍將繼續看到流程「活着」。
可以提高線程一個在許多方面通過測試分層主線程的進展(顯著增加了複雜性和偶然性線程的問題),但是這需要在錯誤的解決辦法,並試圖將其推向正確的。

什麼是最好的是使通過活躍度檢查的程序部分執行的任務(一個或多個)。也許是在完成每個子任務後(通過一個閾值來確保它不會太頻繁發生),或直接查看輸出(如果存在)並確保輸入導致輸出,直接從主線程心跳。

最好在內部(在程序內)和外部(特別是如果有外部消費者/程序的用戶)驗證這一點。如果你有一個Web服務器:嘗試使用它,如果你的應用是基於事件循環的系統:觸發它必須響應的事件(並驗證輸出是否正確)。無論做什麼,都要考慮總是希望驗證有用的和正確的行爲發生,而不是任何活動。

您不僅驗證了程序的存在,而且還驗證了動作您的支票將會更有用。你將檢查更多的系統,你將自己從內部狀態放到更遠的位置,如果你在監視器上運行你的監視器進程,你只能檢查本地環回,運行掉盒子會驗證更多的網絡堆棧,包括經常被遺忘的方面,如DNS 。

不可避免地這使得檢查更難做,因爲你本質上是在考慮一個特定的任務而不是一般的解決方案,所以從這個方面獲得的利益應該產生足夠的好處,這種方法在許多情況下被認真考慮。

+0

非常感謝這種洞察力;最有用。我認爲這種方法最適合我的需求。 – pierre 2009-07-30 10:35:14

0

您可以使用輪詢機制並定期詢問遠程應用程序的狀態。

0

這是很難知道,如果一個應用程序崩潰或實際上是做一些有用的東西。

考慮一下:

while(true); 

該處理器(非常)繁忙。如果這是在一個單獨的線程中完成的,它甚至可能會作出響應。但是,由於應用程序不再工作,這實際上是不受歡迎的行爲。解決這個

最好的辦法是定期(在軟件的某些點)添加一定計數器和播出這些。看門狗應用程序可以監聽這些廣播,如果它們沒有到達或不再有意義(計數器不加起來),那麼你可以終止進程並重新啓動它。

廣播可以用多種方式完成。最簡單的方法是將計數器寫入文件(確保文件在寫入時被鎖定,以便讀取過程在完全相同的時間讀取文件時不會看到半個文件)

更多高級方法是使用命名管道,或使用套接字。在這種情況下,UDP套接字非常容易設置和使用。不要擔心「分組丟失」,因爲在本地網絡上這種情況幾乎不會發生