進程守護系統,用於監控指定的進程,當發現目標進程再也不正常工做時,就關閉該進程,並重啓它。html
在什麼狀況下使用進程守護系統了?好比說,咱們的某個服務器軟件,在上線後出現一個嚴重的bug,該bug雖然很難出現,可是隻要一出現,整個服務都會停掉(進程沒有崩潰,只是再也不提供服務)。此時,重啓服務軟件,又會開始正常工做。服務器
對於這樣嚴重的bug,必需要查清楚並解決掉的。可是,基於如下兩個緣由:測試
(1)系統已經對用戶開放,服務不能停。不可能說系統先下線,直到bug被解決掉後再從新上線。spa
(2)bug很難重現,可能須要加日誌,不斷地跟蹤排查,這極可能是一場持久戰。debug
爲了讓系統繼續線上運行,在bug解決以前,必需要保證系統中止服務以後,能迅速從新啓動恢復服務。此時,使用進程守護系統是最恰當不過的了。調試
OrayGuard就是爲達到這一目的,實現了一個進程守護系統。一個守護者程序,能夠守護同一臺機器上的多個進程。日誌
OrayGuard守護者對被守護進程的管理使用的是心跳機制,其原理描述以下:code
(1)被守護進程定時向守護者報告(發送心跳),以代表本身是在正常提供服務。htm
(2)若是守護者發現某個被守護進程連續一段時間都沒有心跳過來,就關閉對應的進程,而後再啓動對應的程序。blog
在OrayGuard系統中,爲了方便使用,已經作了不少工做,直接提供以下設施給使用者。
(1)在守護者這一方:提供了可直接運行的exe,雙擊便可運行起來。
(2)在被守護進程這一方:提供了OrayGuard.Core.dll,使用者只要調用其中的GuardianProxy靜態類的幾個方法,便可完成全部工做。
/// <summary> /// 與守護服務進行通訊的Proxy,提供給被守護進程直接使用。 /// </summary> public static class GuardianProxy { /// <summary> /// 初始化Proxy,並向守護服務註冊當前進程。 /// </summary> /// <param name="guardServerPort">守護進程提供服務的Port</param> /// <param name="timeoutInSecs">超時間隔。單位:秒</param> public static void Initialize(int guardServerPort, int timeoutInSecs); /// <summary> /// 向守護服務激活當前進程一次。 /// </summary> public static void Activate(); /// <summary> /// 向守護服務註銷當前進程。 /// </summary> public static void Dispose(); }
在被守護方:
(1)進程啓動時,調用GuardianProxy的Initialize方法,便可向守護者註冊當前進程。(端口號就填守護者配置文件中設定的端口)
(2)進程內須要定時(好比10秒一次)檢測本身是否仍在正常提供服務,若是是,則調用GuardianProxy的Activate方法,向守護者發送心跳。
(3)當進程正常退出時,調用GuardianProxy的Dispose方法向守護者註銷。
最後,咱們編寫了一個用於演示的被守護進程的項目,整個系統運行起來後,效果以下:
(注意:實際測試時,不要調試,而是要雙擊演示項目debug目錄下的TestProcess.exe運行演示,不然,模擬故障後,演示進程會被關閉,可是沒法被重啓。由於,調試時,檢測到的是TestProcess.vshost.exe)
下載 OrayGuard。壓縮包中包含以下內容:
(1)OrayGuard守護者:可直接運行的守護者程序。
(2)SDK:供被守護進程使用的SDK。
(3)TestProcess:用於演示的被守護進程的項目源碼。