gpt4 book ai didi

c# - 在 .NET Core 2 linux 守护进程中优雅地关闭通用主机

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:11 25 4
gpt4 key购买 nike

我对 .NET Core 和开发 Linux 守护进程都是全新的。我经历过几个类似的问题,例如 Killing gracefully a .NET Core daemon running on LinuxGraceful shutdown with Generic Host in .NET Core 2.1但他们没有解决我的问题。

我使用托管服务构建了一个非常简单的控制台应用程序作为测试。我希望它作为守护进程运行,但我无法正确关闭它。当它在 Windows 和 Linux 中从控制台运行时,一切正常。

public static async Task Main(string[] args)
{
try
{
Console.WriteLine("Starting");

var host = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<DaemonService>();
});

System.IO.File.WriteAllText("/path-to-app/_main.txt", "Line 1");
await host.RunConsoleAsync();
System.IO.File.WriteAllText("/path-to-app/_main.txt", "Line 2");
}
finally
{
System.IO.File.WriteAllText("/path-to-app/_main-finally.txt", "Line 1");
}
}

public class DaemonService : IHostedService, IDisposable
{
public Task StartAsync(CancellationToken cancellationToken)
{
System.IO.File.WriteAllText("/path-to-app/_Start.txt", "Line 1");

return Task.CompletedTask;
}

public Task StopAsync(CancellationToken cancellationToken)
{
System.IO.File.WriteAllText("/path-to-app/_Stop.txt", "Line 1");

return Task.CompletedTask;
}

public void Dispose()
{
System.IO.File.WriteAllText("/path-to-app/_Dispose.txt", "Line 1");
}
}

如果我从控制台运行应用程序,一切都会按预期进行。然而,当它作为守护进程运行时,在执行 kill <pid> 之后或 systemctl stop <service> , StopAsyncDispose方法被执行,但没有别的:不是 Main 中的在await之后也不是 finally block 。

注意:我没有使用 ASP.NET Core 中的任何东西。据我所知,我正在做的事情没有必要。

我做错了什么吗?这是预期的行为吗?

最佳答案

这个答案对于 dotnet core 3.1 是正确的,但应该是一样的。

host.RunConsoleAsync() 等待 Sigterm 或 ctrl + C。

切换到 host.Start() 并且程序在 IHostedServices 完成时停止。

我不认为这条线目前被击中:

System.IO.File.WriteAllText("/path-to-app/_main.txt", "Line 2");

关于c# - 在 .NET Core 2 linux 守护进程中优雅地关闭通用主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55812428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com