我正在尝试在Linux ARM设备上优雅地关闭我的控制台应用程序。发送的信号是
以下是一个最小可复现示例(MRE):
在调试模式下,当调用
在发布模式下,唯一发生的事情就是以下日志信息:
然而,该应用程序仍在运行,只能通过
SIGTERM
。我使用新的PosixSignalRegistration.Create()方法实现了一个Posix信号处理程序。当以调试模式编译时,这可以完美地工作。然而,在启用优化的发布模式下,处理程序从未被执行。以下是一个最小可复现示例(MRE):
using Microsoft.Extensions.Hosting;
using System.Runtime.InteropServices;
ManualResetEvent resetEvent = new(false);
CancellationTokenSource cts = new();
// Handles CTRL + C in both operating systems
Console.CancelKeyPress += (sender, eventArgs) =>
{
Console.WriteLine("Received CTRL+C");
resetEvent.Set();
eventArgs.Cancel = true;
cts.Cancel();
};
// Handles graceful kill (Sigterm) in linux (e.g. systemctl stop)
PosixSignalRegistration.Create(PosixSignal.SIGTERM, (context) =>
{
Console.WriteLine("Received SIGTERM");
resetEvent.Set();
cts.Cancel();
});
IHost? host = null;
try
{
var hostBuilder = Host.CreateDefaultBuilder(args);
host = hostBuilder.Build();
host.Start();
resetEvent.Reset();
resetEvent.WaitOne();
}
catch
{
Console.WriteLine("Error");
}
finally
{
Console.WriteLine("finally");
await (host?.StopAsync(TimeSpan.FromSeconds(5)) ?? Task.CompletedTask);
Console.WriteLine("Application shut down");
}
在调试模式下,当调用
pkill my-application -15
时,日志如下,并且应用程序关闭:Received SIGTERM
finally
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
Application shut down
在发布模式下,唯一发生的事情就是以下日志信息:
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
然而,该应用程序仍在运行,只能通过
Ctrl + C
或pkill my-application -2
优雅地关闭。
我错过了什么吗?