我需要通知systemd
我的服务已成功启动,并且它需要在启动后运行的任务要求服务器已经在侦听目标 Unix 域套接字。
我IWebHost::Run
用来启动服务器,这是一个阻塞调用。此外,我找不到任何明显的方法来设置成功初始化的委托或回调事件。
任何人?
我需要通知systemd
我的服务已成功启动,并且它需要在启动后运行的任务要求服务器已经在侦听目标 Unix 域套接字。
我IWebHost::Run
用来启动服务器,这是一个阻塞调用。此外,我找不到任何明显的方法来设置成功初始化的委托或回调事件。
任何人?
您可以使用Microsoft.AspNetCore.Hosting.IApplicationLifetime:
/// <summary>
/// Triggered when the application host has fully started and is about to wait
/// for a graceful shutdown.
/// </summary>
CancellationToken ApplicationStarted { get; }
查看此SO 帖子以获取配置示例。
这就是我最终的结果,现在。似乎工作正常:
host.Start();
Log.Information("Press Ctrl+C to shut down...");
Console.CancelKeyPress += OnConsoleCancelKeyPress;
var waitHandles = new WaitHandle[] {
CancelTokenSource.Token.WaitHandle
};
WaitHandle.WaitAll(waitHandles);
Log.Information("Shutting down...");
然后,在 Ctrl+C 事件处理程序中:
private static void OnConsoleCancelKeyPress(object sender, ConsoleCancelEventArgs e)
{
Log.Debug("Got Ctrl+C from console.");
CancelTokenSource.Cancel();
}
这就是我为克服这个问题所做的。
1-我注册ApplicationStopped
了活动。Kill()
这样它就会通过调用当前进程的方法来蛮力终止应用程序。
public void Configure(IHostApplicationLifetime appLifetime) {
appLifetime.ApplicationStarted.Register(() => {
Console.WriteLine("Press Ctrl+C to shut down.");
});
appLifetime.ApplicationStopped.Register(() => {
Console.WriteLine("Terminating application...");
System.Diagnostics.Process.GetCurrentProcess().Kill();
});
}
请参阅 IHostApplicationLifetime 文档
2-不要忘记UseConsoleLifetime()
在构建主机时使用。
Host.CreateDefaultBuilder(args).UseConsoleLifetime(opts => opts.SuppressStatusMessages = true);