守护服务

optimize
wanghaomei 1 year ago
parent 4ee5717b0d
commit 46305c447f

@ -1,7 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="DeamonServiceName" value="ServiceDeamon"/>
<add key="DeamonServiceDisplayName" value="进程守护服务"/>
<add key="ServiceName" value="nginx"/>
<add key="CheckInteval" value="5000"/>
</appSettings>
</configuration>

@ -10,18 +10,18 @@ namespace ServiceDeamon
{
public class CheckServiceHelper
{
private static ServiceController servCtl;
private static string ServName = ConfigurationManager.AppSettings["ServiceName"];
private static ServiceControllerStatus LastStatus;
public static void CheckStatus()
{
if (servCtl == null || servCtl.ServiceName != ServName)
{
servCtl = new ServiceController(ServName);
}
var servCtl = new ServiceController(ServName);
if (LastStatus != servCtl.Status)
{
Console.WriteLine($"服务 {ServName} 的当前状态:{servCtl.Status}");
}
if (servCtl != null && servCtl.Status == ServiceControllerStatus.Stopped)
{
@ -29,6 +29,8 @@ namespace ServiceDeamon
servCtl.Start();
}
LastStatus = servCtl.Status;
//Console.WriteLine("CheckStatus");
}
}

@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Topshelf;
namespace ServiceDeamon
{
public class DeamonService : ServiceControl
{
private static Timer timer;
private static int CheckInteval = Convert.ToInt32(ConfigurationManager.AppSettings["CheckInteval"]);
public bool Start(HostControl hostControl)
{
timer = new Timer(new TimerCallback(CheckSta));
timer.Change(CheckInteval, Timeout.Infinite);
return true;
}
public bool Stop(HostControl hostControl)
{
timer.Change(-1, 0);
return true;
}
private static void CheckSta(object sta)
{
CheckServiceHelper.CheckStatus();
timer.Change(CheckInteval, Timeout.Infinite);
}
}
}

@ -1,27 +1,52 @@
using ServiceDeamon;
using System.Configuration;
using System.ServiceProcess;
using Topshelf;
public class Program
{
private static Timer timer;
private static int CheckInteval = Convert.ToInt32(ConfigurationManager.AppSettings["CheckInteval"]);
public static void Main(string[] args)
{
timer = new Timer(new TimerCallback(CheckSta));
timer.Change(CheckInteval, Timeout.Infinite);
try
{
var serviceName = ConfigurationManager.AppSettings["DeamonServiceName"];
var serviceDisplayName = ConfigurationManager.AppSettings["DeamonServiceDisplayName"];
Console.Read();
if (Environment.UserInteractive)
{
Console.Title = serviceDisplayName;
}
private static void CheckSta(object sta)
Host host = HostFactory.New(x =>
{
// 基本的配置
x.RunAsLocalSystem();
x.SetServiceName(serviceName);
x.SetDisplayName(serviceDisplayName);
x.StartAutomaticallyDelayed();
x.EnableShutdown();
// 注册服务
x.Service(hostSettings => new DeamonService());
// 设置服务失败后的操作,分别对应第一次、第二次、后续
x.EnableServiceRecovery(t =>
{
CheckServiceHelper.CheckStatus();
t.RestartService(0);
timer.Change(CheckInteval, Timeout.Infinite);
t.RestartService(0);
t.RestartService(0);
t.OnCrashOnly();
});
});
host.Run();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}

Loading…
Cancel
Save