一個應用需要常駐操作系統后臺服務,可選框架有WindowsServiceLifeTime和SystemdLifeTime,但需要區別對待不同操作系統且需要另外寫命令安裝。NewLife.Agent自2008年設計以來,一直秉著簡單易用的原則,不僅實現了服務框架,還實現了安裝卸載的簡易菜單。今天,我們讓NewLife.Agent實現IHostLifeTime,成為同時支持Windows和Linux的新一代服務主機!
開源項目:https://github.com/NewLifeX/NewLife.Agent
Nuget:NewLife.Extensions.Hosting.AgentService
快速入門
新建WorkerService服務項目,從Nuget引入 NewLife.Extensions.Hosting.AgentService 。
入口函數中寫入:
using NewLife.Extensions.Hosting.AgentService;
using TestWorker;IHost host = Host.CreateDefaultBuilder(args).ConfigureServices(services =>{services.AddHostedService<Worker>();}).UseAgentService(options =>{options.ServiceName = "TestWorker";options.DisplayName = "Worker服務測試";options.Description = "Worker服務的測試應用";}).Build();await host.RunAsync();
Woker類中寫入
using NewLife.Log;namespace TestWorker
{public class Worker : BackgroundService{private readonly ILog _logger;public Worker(ILog logger){_logger = logger;}protected override async Task ExecuteAsync(CancellationToken stoppingToken){while (!stoppingToken.IsCancellationRequested){_logger.Info("Worker running at: {0}", DateTimeOffset.Now);await Task.Delay(1000, stoppingToken);}}public override Task StartAsync(CancellationToken cancellationToken){XTrace.WriteLine(nameof(StartAsync));return base.StartAsync(cancellationToken);}public override Task StopAsync(CancellationToken cancellationToken){XTrace.WriteLine(nameof(StopAsync));return base.StopAsync(cancellationToken);}}
}
雙擊 TestWorker.exe 跑起來,也可以 dotnet TestWorker.dll 跑起來。
按鍵 5 進入模擬運行,即是執行Worker等所有 IHostedService,方便開發調試。
安裝服務
引入 NewLife.Extensions.Hosting.AgentService 后,應用本身直接啟動時,是一個控制菜單,用于控制服務的安裝卸載、啟動和停止。控制菜單和服務屬于兩個進程。
按鍵 2 可以安裝服務
這里失敗了,因為安裝卸載Windows服務需要管理員權限(Linux需要sudo)。在 TestWorker.exe 上點右鍵,“以管理員身份運行”。
按 3 即可啟動服務,也可以在Windows服務中找到服務并啟動。在 Linux 中,可以用 systemctl start TestWorker 啟動服務。
至此,同時支持Windows和Linux的新一代服務主機示例完成。