C# 寫的windows服務程序守護實現
阿新 • • 發佈:2021-01-21
C# 寫的windows服務程序守護實現
最近在做一個windows服務實現windows socket server讀取系統硬體,RFID的內容給WEB網站使用。在測試過程中,發現RFID讀取過程有時會導致服務無端中止。因為涉及到硬體呼叫,查不到具體的原因。所以就簡單的處理,做一個程序守護,當windows的服務程序退出之後,自動重新開啟。以前使用的方法是,另外做一個程式監測。因為那種方法比較麻煩,現在介紹一種更簡單的方法。使用cmd使用。
1. 首先建立複製一下內容。新建一個autostart.bat的指令碼檔案。
@echo off rem 定義迴圈間隔時間和監測的服務: set secs=60 set srvname="服務名稱" echo. echo ======================================== echo == 查詢計算機服務的狀態, == echo == 每間隔%secs%秒種進行一次查詢, == echo == 如發現其停止,則立即啟動。 == echo ======================================== echo. echo 此指令碼監測的服務是:%srvname% echo. if %srvname%. == . goto end :chkit set svrst=0 for /F "tokens=1* delims= " %%a in ('net start') do if /I "%%a %%b" == %srvname% set svrst=1 if %svrst% == 0 net start %srvname% set svrst= rem 下面的命令用於延時,否則可能會導致cpu單個核心滿載。 ping -n %secs% 127.0.0.1 > nul goto chkit :end 雙擊該批處理檔案,執行介面如下 ======================================== == 查詢計算機服務的狀態, == == 每間隔%secs%秒種進行一次查詢, == == 如發現其停止,則立即啟動。 == ======================================== 此指令碼監測的服務是:%srvname% 如果%srvname%停止後,該批處理檢測到後會重啟該服務,介面如下 ======================================== == 查詢計算機服務的狀態, == == 每間隔%secs%秒種進行一次查詢, == == 如發現其停止,則立即啟動。 == ======================================== 此指令碼監測的服務是:%srvname% %srvname% 服務正在啟動 %srvname% 服務已經啟動成功。
按實際情況修改
set srvname="服務名稱"
這裡的服務名稱。
把檔案儲存到服務的安裝資料夾。
2. C#相關程式碼
/// <summary> /// 啟動服務 /// </summary> /// <param name="args"></param> protected override void OnStart(string[] args) { StartTimer(); } System.Timers.Timer timer = new System.Timers.Timer(); /// <summary> /// 啟動定時器 /// </summary> private void StartTimer() { timer.Interval = 1000; timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); timer.Start(); } ///執行的 void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { if (!PortInUse(13001)) { //LogOuts.Debug("open:"+1); //啟動socket StartWS(); } else { //LogOuts.Debug("open:" + 2); } //如果沒執行命令,執行cmd監聽。 if (!execdCmd) { execdCmd = true; execCmd(); } } private bool execdCmd = false; private void execCmd() { Process proc = null; try { proc = new Process(); proc.StartInfo.FileName = AppDomain.CurrentDomain.BaseDirectory+ @"\\autostart.bat"; proc.StartInfo.Arguments = string.Format("");//this is argument proc.StartInfo.CreateNoWindow = false; proc.Start(); proc.WaitForExit(); } catch (Exception ex) { Console.WriteLine("Exception Occurred :{0},{1}", ex.Message, ex.StackTrace.ToString()); } }