NetCore windowsService 看门狗应用程序
public class DogService : BackgroundService { public override Task StartAsync(CancellationToken cancellationToken) { return base.StartAsync(cancellationToken); } /// <summary> /// 每一秒执行一次 /// </summary> /// <param name="stoppingToken"></param> /// <returns></returns> protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { StartService(); await Task.Delay(1000 * 60 , stoppingToken); } } public override Task StopAsync(CancellationToken cancellationToken) { return base.StopAsync(cancellationToken); } private void StartService() { List<string> services = new List<string>() { "ChargRabbitService" }; foreach (var item in services) { ServiceController service = new ServiceController(item); try { if (service.Status != ServiceControllerStatus.Running) { service.Start(); service.WaitForStatus(ServiceControllerStatus.Running); } } catch (Exception ex) { continue; } } } }
main
static class Program { static void Main(string[] args) { ConfigurationBuilder builder = new ConfigurationBuilder(); builder.AddJsonFile("appsettings.json", true, true); var ConfigRoot = builder.Build();//根节点 IServiceCollection Services = new ServiceCollection(); Services.AddLogging(log => { log.AddConsole(); log.AddNLog(); log.SetMinimumLevel(LogLevel.Error); }); // using (ServiceProvider provider = Services.BuildServiceProvider()) { } CreateHostBuilder(args).Run(); } public static IHost CreateHostBuilder(string[] args) { var builder = Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddHostedService<DogService>(); }).UseWindowsService(); var host = builder.Build(); return host; } }
将发布的exe 设置为 以管理员身份运行 【属性-安全】
2024-11-27更新
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using NLog.Extensions.Logging; using Quartz; using Quartz.Impl; using System; using System.Linq; using System.Threading.Tasks; namespace RabbitDogService { static class Program { static async Task Main(string[] args) { ConfigurationBuilder builder = new ConfigurationBuilder(); builder.AddJsonFile("appsettings.json", true, true); var ConfigRoot = builder.Build();//根节点 IServiceCollection Services = new ServiceCollection(); Services.AddLogging(log => { log.AddConsole(); log.AddNLog(); log.SetMinimumLevel(LogLevel.Error); }); // Services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();//注册ISchedulerFactory的实例。 Services.AddScoped<QuartzService>();//注册 QuartzService 的实例。 using (ServiceProvider provider = Services.BuildServiceProvider()) { var service = provider.GetService<QuartzService>(); await service.Restart(); } CreateHostBuilder(args).Run(); } public static IHost CreateHostBuilder(string[] args) { var builder = Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddHostedService<DogService>(); }).UseWindowsService(); var host = builder.Build(); return host; } } }
和 dogServie
using Microsoft.Extensions.Hosting; using swapCommon; using System; using System.Collections.Generic; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading; using System.Threading.Tasks; namespace RabbitDogService { public class DogService : BackgroundService { public override Task StartAsync(CancellationToken cancellationToken) { if (!cancellationToken.IsCancellationRequested) { } return base.StartAsync(cancellationToken); } /// <summary> /// 每一秒执行一次 /// </summary> /// <param name="stoppingToken"></param> /// <returns></returns> protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { StartService(); await Task.Delay(1000 * 60 * 15, stoppingToken); } } public override Task StopAsync(CancellationToken cancellationToken) { return base.StopAsync(cancellationToken); } private void StartService() { var configService = ConfigCommon.GetConfig("Services"); //Console.WriteLine(configService); var services = configService.Split(",").ToList(); foreach (var item in services) { ServiceController service = new ServiceController(item); try { if (service.Status != ServiceControllerStatus.Running) { service.Start(); service.WaitForStatus(ServiceControllerStatus.Running); } } catch (Exception ex) { continue; } } } } }
和定时重启
using Microsoft.Extensions.Logging; using Quartz; using swapCommon; using System; using System.Collections.Generic; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading; using System.Threading.Tasks; namespace RabbitDogService { public class QuartzService { private readonly ISchedulerFactory _schedulerFactory; private IScheduler _scheduler; private readonly ILogger<QuartzService> logger; public QuartzService(ISchedulerFactory schedulerFactory, ILogger<QuartzService> logger) { _schedulerFactory = schedulerFactory; this.logger = logger; } public class RestartService : IJob { public Task Execute(IJobExecutionContext context) { var server = ConfigCommon.GetConfig("ServerOptions:server"); var configService = ConfigCommon.GetConfig("Services"); //Console.WriteLine(configService); var services = configService.Split(",").ToList(); foreach (var item in services) { ServiceController service = new ServiceController(item); try { Console.WriteLine("开始执行"); if (service.Status != ServiceControllerStatus.Running) { Console.WriteLine("开始启动"); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running); } else { Console.WriteLine("开始停止"); service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped); Thread.Sleep(4500); Console.WriteLine("停止完成后启动"); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running); } } catch (Exception ex) { continue; } } return Task.Run(() => { Console.WriteLine("执行结束:"); }); } } public async Task Restart() { //通过调度工厂获得调度器 _scheduler = await _schedulerFactory.GetScheduler(); //开启调度器 await _scheduler.Start(); logger.LogError("调度器开始工作-断电"); //创建一个触发器 var trigger = TriggerBuilder.Create().StartNow().WithCronSchedule("0 08 23 ? * *") //每天17.59点断电 .Build(); //创建任务 var jobDetail = JobBuilder.Create<RestartService>() .Build(); //将触发器和任务器绑定到调度器中 await _scheduler.ScheduleJob(jobDetail, trigger); } } }