【问题标题】:How do I properly send a SIGTERM to a dotnet core ASP app running on Mac?如何正确地将 SIGTERM 发送到在 Mac 上运行的 dotnet core ASP 应用程序?
【发布时间】:2021-11-12 23:21:35
【问题描述】:

我的 Startup.cs 中有这个:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, Microsoft.Extensions.Hosting.IApplicationLifetime appLifetime)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });

    appLifetime.ApplicationStopping.Register(() => Console.WriteLine("ApplicationStopping called"));
    appLifetime.ApplicationStopped.Register(() => Console.WriteLine("ApplicationStopped called"));
}

我启动我的 dotnet 应用程序:dotnet run --project myapp/myapp.csproj

我得到进程 ID:ps | grep "dotnet run --project myapp/myapp.csproj"

我向进程发送一个 sigterm:kill <PID>

应用程序立即终止,我看不到控制台日志消息。 kill 应该默认发送一个 SIGTERM。

我是在使用 IApplicationLifetime 错误还是发送 SIGTERM 错误?

编辑

我认为我可能错误地使用了 IApplicationLifetime,因为我也添加了它,但我也从未看到这些消息:

appLifetime.ApplicationStarted.Register(() => Console.WriteLine("ApplicationStarted called"));

【问题讨论】:

    标签: c# macos


    【解决方案1】:

    文档says“当应用程序主机执行正常关机时触发。”这看起来不像是 windows-born 框架的杀戮。

    有一些关于如何手动触发它的旧线程:Getting ASP.Net Core shutdown triggering ApplicationStopping event in IISExpress 还有asp.net core: IApplicationLifetime.ApplicationStopping isn't triggered

    但如果你真的想要捕捉 SIGTERM,你需要谷歌“unix 信号处理程序”。

    这个有C API,也有mono implementation,最后有(或即将出现)ms implementation

    【讨论】:

    • .net 应该做这个 ootb。当 pod 终止时,k8s 会向进程发送一个 sigterm。我需要在本地模拟它以测试任何日志记录/关闭例程。
    猜你喜欢
    • 2018-11-25
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多