(廣西廣播電視無線傳播樞紐臺)
在實際工作中,運行在服務器上的各類軟件服務程序,偶爾出現異常后退出或者不能正常工作,這樣該軟件服務程序就無法提供準確的數據和執行各項指令,給使用者造成了困擾。為了解決這個問題,本文提出了一種基于C#的進程守護程序解決方案,在服務器上運行一個守護程序,實時監視軟件服務程序的進程或心跳包,當軟件服務程序出現異常退出或者進入假死狀態不能正常工作時,進程守護程序的監視端可自動對出現故障的軟件服務程序進行復位重啟,亦可人工在進程守護程序的客戶端界面上對出現故障的軟件服務程序進行復位重啟,使軟件服務程序恢復正常運行。
1.目標
使用者能方便地查看所監視的各軟件服務程序的當前運行狀態,并可以手動復位重啟程序。
2.涉眾
主要涉眾是各軟件服務程序的使用者。
本進程守護程序分為三個部分:
1.守護系統服務端(下稱服務端):負責將接收到的客戶端復位指令轉發給監視端,又將監視端復位軟件服務程序的結果、監視端的通信狀態和軟件服務程序的運行狀態轉發給客戶端。
2.守護系統監視端(下稱監視端):該端部署在各軟件服務程序所在的服務器上,接收到復位指令后,按照指令復位指定軟件服務程序并將復位結果發送給服務端;定時將軟件服務程序的運行狀態發送給服務端。軟件服務程序運行在不同的服務器上,所以監視端也將部署在多個服務器上。
3.守護系統客戶端(下稱客戶端):負責將復位指令發送給服務端,并顯示復位的結果;顯示軟件服務程序的運行狀態。客戶端部署在值班平臺的多個值班電腦上。

圖1 系統業務概念分析圖
1.概述
進程守護程序主要有4個業務流程:
(1)復位軟件服務程序;
(2)顯示軟件服務程序的運行狀態(正常,異常,未運行);
(3)顯示監視端的通信狀態;
(4)顯示服務端的通信狀態。
2.復位軟件服務程序的業務流程
使用者在客戶端上點擊復位一個或多個軟件服務程序,客戶端接收到復位事件后,立即發送復位指令給服務端。服務端收到指令后,檢測接受指令的一個或多個監視端是否在線,如不在線,則將“監視端不在線,復位失敗”的結果返回客戶端,如果在線,則發送復位指令給監視端。監視端收到復位指令后,立即復位指定的軟件服務程序,然后將復位結果返回給服務端。服務端也立即將復位結果返回給客戶端。客戶端接收復位結果的指令后,顯示在界面上。
3.顯示軟件服務程序的運行狀態的業務流程
監視端定時收集軟件服務程序的運行狀態(正常,異常,未運行)上報給服務端。服務端收到狀態數據后,存入軟件服務程序運行狀態列表中。客戶端啟動成功后定時從服務端獲取軟件服務程序運行狀態列表數據,然后在界面上顯示。
4.顯示監視端的通信狀態
監視端定時發送心跳包給服務端,服務端收到心跳包后存入監視端通信狀態列表,客戶端啟動成功后定時從服務端獲取監視端通信狀態列表數據,然后在界面上顯示。
5.顯示服務端的通信狀態
客戶端啟動成功后定時發送心跳包給服務端,并將通信狀態顯示在界面上。

圖2 系統總用例圖
進程守護程序分為三個部分:
1.服務端:是一個中間件,負責轉發客戶端和監視端的數據信息,采用C#語言編寫,運行于.Net Core3.1框架下,支持跨平臺運行,服務端使用UDP協議與客戶端、監視端進行通信。
2.監視端:負責守護一個或多個軟件服務程序,部署在軟件服務程序所在的服務器上,采用C#語言編寫,運行于.Net Core3.1框架下,支持跨平臺運行。
3.客戶端:是部署在值班平臺操作電腦上,C#語言編寫,因為值班操作電腦使用Windows系統,故使用.Net FrameWork 4.7.2框架,提供WinForm友好可視界面,方便使用者直觀地查看各軟件服務程序的運行狀態和進行復位操作。

圖3 系統架構圖
服務端基于.Net Core框架來創建,主要實現轉發功能和狀態存儲功能。服務端啟動后,創建一個Lsit
Socket對象實例化后,綁定一個偵聽端口,實時接收客戶端和監視端發送過來的UDP包,并對接收到的數據包進行解析,如果是客戶端發來的復位的指令,就將復位指令轉發給相應的監視端;如果是監視端返回的復位結果,則將結果轉發給客戶端;如果是監視端發來其自身和所監視的軟件服務程序的狀態數據,就將該狀態數據推入消息隊列。
BackgroundWorker線程對象實例化后,定時檢查消息隊列是否存在新消息,如果有新狀態數據,則進行解析處理,并將結果存入Lsit
客戶端基于.Net FrameWork框架來實現,主要是實現各監視端和軟件服務程序狀態的實時顯示和進行復位操作指令的下發以及復位結果的顯示。
客戶端初始化時,創建一個Socket對象,并向服務端發送獲取監視端和軟件服務程序狀態的請求,收到返回結果后,根據數據列表,動態創建Label對象和Button對象,將監視端和軟件服務程序狀態顯示在UI界面上。此后就定時接收服務端推送過來的實時狀態列表數據,并更新顯示在UI界面上。
當使用者選擇某個軟件服務程序進行復位時,客戶端監聽到給復位事件,就通過Socket對象發送復位指令給服務端;當收到服務端轉發來的復位結果后,就將復位結果通過Label對象顯示出來。
監視端基于.Net Core框架來創建,主要實現自動或根據指令復位軟件服務程序,和定時監測軟件服務程序的進程和心跳包并上報的功能。
監視端初始化時,創建一個Socket對象,一個List
BackgroundWorker線程對象定時監測軟件服務程序的進程是否還存在,心跳包時間是否已經超時,如果進程不存在或者心跳包已超時,則發送啟動命令啟動軟件服務程序。同時定時將軟件服務程序狀態上報給服務端。
本進程守護程序使用了.Net Core和.Net Framework兩個框架,C#語言編寫,采用UDP協議進行通信。啟用本程序后,在一定程度上能改善軟件服務程序出現異常后的恢復速度,讓使用者能對各軟件服務程序的實時運行狀態了如指掌。