平常在寫監控的朋友,一般應該都是使用net start / net stop / net pause / net continue系列的指令,做成批次檔,然後定時來重啟服務。不過工具程式應該要整合這些功能在工具軟體裡,而且重要的一點是,必須將相依的服務一起停止與啟動,讓我們來看看怎麼做:
Dim Controller As New ServiceController("DHCP Client")
Dim RunningDService As String = ""
Dim scServices As ServiceController() = Controller.DependentServices
'沒有依存的服務
If scServices.Length = 0 Then
If Controller.Status = ServiceControllerStatus.Running Then
Controller.Stop()
Controller.WaitForStatus(ServiceControllerStatus.Stopped)
WriteToLog("停止服務 COM+ Event System 成功!!")
End If
Controller.Start()
Controller.WaitForStatus(ServiceControllerStatus.Running)
'等待啟動成功後再寫LOG
WriteToLog("啟動服務 COM+ Event System 成功!!")
Else '有依存服務時需先停止依存服務
Dim scTemp As ServiceController
For Each scTemp In scServices
If scTemp.Status = ServiceControllerStatus.Running Then
scTemp.Stop()
scTemp.WaitForStatus(ServiceControllerStatus.Stopped)
'等待停止成功後再寫LOG
WriteToLog("停止相依服務 " & scTemp.DisplayName & " 成功!!")
RunningDService = RunningDService & scTemp.DisplayName
End If
Next scTemp
If Controller.Status = ServiceControllerStatus.Running Then
Controller.Stop()
Controller.WaitForStatus(ServiceControllerStatus.Stopped)
'等待停止成功後再寫LOG
WriteToLog("停止服務 " & Controller.DisplayName & " 成功!!")
End If
Controller.Start()
Controller.WaitForStatus(ServiceControllerStatus.Running)
WriteToLog("啟動服務 " & Controller.DisplayName & " 成功!!")
'啟動主要服務後,再啟動依存服務
For Each scTemp In scServices
If InStr(RunningDService, scTemp.DisplayName) <> 0 Then
scTemp.Start()
scTemp.WaitForStatus(ServiceControllerStatus.Running)
'等待啟動成功後再寫LOG
WriteToLog("啟動相依服務 " & scTemp.DisplayName & " 成功!!")
End If
Next scTemp
End If
以上程式直接放在按鈕的CLICK事件中即可執行,在程式中加了一些註解希望對看倌們有幫助。當然可以更進階的使用,把程式弄成常駐,每隔一段時間去詢問Service的狀態,如果不是已啟動時,使重啟它,這個方法還蠻簡單好用的,筆者常拿來使用。
沒有留言:
張貼留言