摘要
很多情況下,都會使用windows服務做一些任務,但總會有一些異常,導致服務停止。這個時候,開發人員又不能立馬解決問題,所以做一個守護者服務還是很有必要的。當檢測到服務停止了,重啟一下服務,等開發人員到位了,再排查錯誤日志。
代碼
app.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <appSettings> <!--要守護的服務的服務名稱--> <add key="toWatchServiceName" value=""/> <!--守護服務的名稱--> <add key="serviceName" value="郵件提醒服務守護服務"/> <!--每1分鍾檢查一次 以秒為單位--> <add key="timerInterval" value="60"/> </appSettings> </configuration>
服務
using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading.Tasks; namespace WindowsService.Watch { partial class ServiceWather : ServiceBase { private static string currentExePath = string.Empty; public ServiceWather() { InitializeComponent(); currentExePath = AppDomain.CurrentDomain.BaseDirectory; } /// <summary> /// 檢查間隔 /// </summary> private static readonly int _timerInterval = Convert.ToInt32(ConfigurationManager.AppSettings["timerInterval"]) * 1000; /// <summary> /// 要守護的服務名 /// </summary> private static readonly string toWatchServiceName = ConfigurationManager.AppSettings["toWatchServiceName"]; private System.Timers.Timer _timer; protected override void OnStart(string[] args) { //服務啟動時開啟定時器 _timer = new System.Timers.Timer(); _timer.Interval = _timerInterval; _timer.Enabled = true; _timer.AutoReset = true; _timer.Elapsed += _timer_Elapsed; LogHelper.WriteLog(currentExePath, "守護服務開啟"); } void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { //如果服務狀態為停止,則重新啟動服務 if (!CheckSericeStart(toWatchServiceName)) { StartService(toWatchServiceName); } } protected override void OnStop() { if (_timer != null) { _timer.Stop(); _timer.Dispose(); LogHelper.WriteLog(currentExePath, "守護服務停止"); } } /// <summary> /// 啟動服務 /// </summary> /// <param name="serviceName">要啟動的服務名稱</param> private void StartService(string serviceName) { try { ServiceController[] services = ServiceController.GetServices(); foreach (ServiceController service in services) { if (service.ServiceName.Trim() == serviceName.Trim()) { service.Start(); //直到服務啟動 service.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 30)); LogHelper.WriteLog(currentExePath, string.Format("啟動服務:{0}", serviceName)); } } } catch (Exception ex) { LogHelper.WriteLog(currentExePath, ex); } } private bool CheckSericeStart(string serviceName) { bool result = true; try { ServiceController[] services = ServiceController.GetServices(); foreach (ServiceController service in services) { if (service.ServiceName.Trim() == serviceName.Trim()) { if ((service.Status == ServiceControllerStatus.Stopped) || (service.Status == ServiceControllerStatus.StopPending)) { result = false; } } } } catch (Exception ex) { LogHelper.WriteLog(currentExePath, ex); } return result; } /// <summary> /// 停止 /// </summary> /// <param name="serviceName"></param> private void StopService(string serviceName) { try { ServiceController[] services = ServiceController.GetServices(); foreach (ServiceController service in services) { if (service.ServiceName.Trim() == serviceName.Trim()) { service.Stop(); //直到服務停止 service.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 30)); LogHelper.WriteLog(currentExePath, string.Format("啟動服務:{0}", serviceName)); } } } catch (Exception ex) { LogHelper.WriteLog(currentExePath, ex); } } } }