我对 .NET Core 和开发 linux 守护程序都是全新的。我遇到了几个类似的问题,例如在 Linux 上优雅地杀死一个 .NET Core 守护程序或在 .NET Core 2.1 中使用 Generic Host 优雅地关闭,但它们并没有解决我的问题。
我使用托管服务构建了一个非常简单的控制台应用程序作为测试。我希望它作为守护进程运行,但我无法正确关闭它。当它在 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>
or之后systemctl stop <service>
,会执行StopAsync
andDispose
方法,但不会执行其他操作:不是 inMain
之后的块,await
也不是finally
块。
注意:我没有使用 ASP.NET Core 中的任何内容。AFAIK 这对我正在做的事情没有必要。
难道我做错了什么?这是预期的行为吗?