为 Ubuntu 制作无休止的控制台应用程序 .NET Core 3.1 在 systemd 上作为服务运行的最佳实践是什么?
首先我试过:
static void Main()
{
//timers (System.Timers.Timer) initialization for background tasks
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
它不能作为 systemd 上的服务工作,因为:
System.InvalidOperationException:当任一应用程序没有控制台或控制台输入已被重定向时,无法读取密钥。
然后我尝试更改Console.ReadKey()为,while(true) {}但它使 CPU 使用率为 100%。
你想要的已经可以通过Worker Service 模板获得。此模板创建控制台应用程序,然后可以将其托管为 Windows 或 Linux 服务。
工作人员服务在Steve Gordon 的什么是 .NET 工作人员服务?. 在 Scott Hanselman 的dotnet new worker - Windows Services or Linux systemd services in .NET Core 中解释了 Systemd 托管。这两篇文章是很多清洁和更容易比理解官方的文档。在阅读 BackgroundService 之前,先从这两个开始。
工人阶级
工作服务是一个实现IHostedService接口的类,并且只要Host应用程序存在就存在。通常,这是通过BackgroundService实现StartAsync和StopAsync方法的基类完成的,因此工作人员只需要实现ExecuteAsync:
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当通过控制台或系统消息/信号发出终止信号时,主机会通知服务在强制关闭之前正常退出。
public static async Task Main(string[] args)
{
await CreateHostBuilder(args).Build().RunAsync();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
});
Run Code Online (Sandbox Code Playgroud)
该主机与 ASP.NET Core 服务使用的主机相同,这意味着可以配置依赖注入、日志记录、配置等
控制台生命周期
RunConsoleAsync可用于代替RunAsync()允许应用程序在 Ctrl+C(在 Windows 上)或 SIGINT/SIGTERM(在 Linux 上)上关闭
托管
该Microsoft.Extensions.Hosting.WindowsService和Microsoft.Extensions.Hosting.Systemd包打理设置控制台应用程序作为Windows或systemd服务来运行的。
对于任一托管方法,所需要的只是调用正确的函数:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
});
Run Code Online (Sandbox Code Playgroud)
或者
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSystemd()
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
290 次 |
| 最近记录: |