应用程序未在发布模式下进入 Posix 信号处理程序

2024-02-03

我正在尝试在 Linux Arm 设备上正常关闭我的控制台应用程序。发送的信号是SIGTERM。我用新的实现了 Posix 信号处理程序PosixSignalRegistration.Create() https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.posixsignalregistration.create?view=net-6.0方法。当在调试模式下编译时,这可以完美地工作。但是,在发布模式(打开优化)下,永远不会进入处理程序。

这是一个 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 or pkill my-application -2.

我缺少什么?


注意PosixSignalRegistration.Create不返回 void,它返回一个实例PosixSignalRegistration。该对象代表您的处理程序的注册,它实现IDisposable并打电话Dispose它将取消注册处理程序。它还具有终结器,其作用与 dispose - 取消注册处理程序相同。

现在请注意,您忽略了返回值PosixSignalRegistration.Create。现在没有对上面提到的注册的引用,垃圾收集器可以自由地收集它。由于它有一个终结器 - 当 GC 收集实例时,它将被调用并且您的处理程序将被取消注册。

这就是你的情况发生的情况。在调试模式下,GC 不会出于各种原因(例如便于调试)收集它。然而,在发布模式下,它可以随时收集,甚至在发布后立即收集PosixSignalRegistration.Create call.

你可能会添加GC.KeepAlive(yourRegistration)在方法末尾调用,但在这种情况下这不是最好的主意,因为注册实现了IDisposable所以你应该尊重这一点:

using (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");
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

应用程序未在发布模式下进入 Posix 信号处理程序 的相关文章

  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • WebGL 中的透明纹理行为

    环境 WebGL Chrome 当使用透明 png 作为模型纹理时 我有以下行为 图像 A 树将建筑物隐藏在其后面 我看到了世界框纹理 它也隐藏自己 后面的分支不可见 同时 图像 B 工作正常 窗口是透明的 我可以看到后面的内容 A B 两
  • 如何匹配Python中封装在列表中的两个字典的键?

    我有两本词典 位于列表中 该列表如下所示 10 1 1 0 1 10 1 1 1 2 10 1 1 0 3 10 1 1 1 4 我需要的是相同的键 即匹配的 ip 我想要相应的数字或值 因此示例输出如下所示 10 1 1 0 1 10 1
  • 优雅地停止 Docker 容器

    我无法理解当容器停止时如何进行一些清理 为了方便起见 我准备了一个示例来重现该问题 以下是我的文件的内容 Dockerfile FROM opensuse latest Install tcsh non interactive mode R
  • 如何使用MACROS(VBA)获取Excel中最后一个非空单元格的地址

    我想获取 Excel 工作表中最后一个非空单元格的单元格地址 基本上我想要最后一个非空单元格的行号和列号 名称 我发现很少有答案可以找出最后一个非空单元格中的值 但我需要单元格地址而不是内容 对于这样的数据 大多数人都希望找到Blue ce
  • 如何在默认的 Eclipse XML 编辑器中显示拼写建议列表?

    我启用了默认的 Eclipse 拼写检查器 当我在 Java 编辑器中工作时检测到拼写错误时 我可以使用Ctrl 1显示建议的拼写更正列表 然而 当我使用默认的 XML 编辑器时 Ctrl 1似乎不起作用 拼写错误的单词 主要是在评论中 正
  • preg_split 意外行为

    I use 预分割 http php net manual en function preg split php如下
  • 无法推送到 Google 容器注册表(无法访问存储库)

    每当我尝试从本地计算机将容器推送到 Google 容器注册表时 都会收到以下错误 被拒绝 无法访问存储库 请检查您是否有权访问它 如果我打开 Cloud Shell 我可以毫无问题地推送容器 我曾多次尝试执行 gcloud auth log
  • 如何使用 EclipseLink 和 Spring 配置动态编织?

    如何使用 EclipseLink 和 Spring 配置动态编织 现在我正在尝试让它与 Junit 测试一起工作 但稍后我必须让它与 Tomcat 一起工作 我的部门已经标准化它大约 10 年了 我遇到两个主要问题 1 Spring需要一个
  • 矩阵中元素的频率 - Matlab

    从我在 matlab 中运行的函数中我得到一个 225x400 矩阵 我想计算这个矩阵中每个元素的频率 这意味着我需要计算每个元素在矩阵上出现的次数 我的矩阵名称是 Idiff 我在用 B unique Idiff 找到 Idiff 矩阵中
  • Android TV以编程方式切换HDMI输入端口

    我想问一下经验丰富的程序员 是否有一种方法可以通过直接安装在电视 Sony Bravia 上的应用程序以编程方式切换 HDMI 输入端口 比方说 在应用程序启动时 电视将其输入切换为 HDMI3 Android 中有通用的 API 还是特定
  • 消除外边距 (Ggplot2 / geom_sf)

    我一直想知道是否可以避免 Ggplot2 包含这个外部边距 绘图区域周围黑框之外的空白区域 我认为又名绘图边距 下面是我的代码 我可以很好地控制绘图边距 但我尝试了不同的方法来减少外部边距 但到目前为止没有任何效果 我还想澄清一下 我知道在
  • 具有特殊条件的子集和

    在您回复另一个问题的链接或将其作为重复项关闭之前 请仔细阅读该问题 这与该问题的标准变体不同 我已经搜索了很长时间 所以我很确定没有这里没有这样的问题 我需要找到是否最小可能的S这是一些的总和X i 的子集那是 gt T 某个目标值 小于全
  • elasticsearch索引已删除

    我的 Elasticsearch 服务器面临严重问题 我在 symfony2 项目上使用 ES 1 7 和 fosElasticaBundle 今天ES索引被删除了两次 我也搞不懂为什么 以下是我可以在 cluster log 中读取的日志
  • Tensorflow 入门 - 将图像分割为子图像

    这是我第一次使用卷积神经网络和 Tensorflow 我正在尝试实现一个能够extract来自数字视网膜图像的血管 我正在与公开可用的驱动数据库 http www isi uu nl Research Databases DRIVE 图像为
  • 将 C++ 中的 unicode 字符串转换为大写

    我们如何在 C 或 C 中将多语言字符串或 unicode 字符串转换为大写 小写 如果您的系统已经采用 UTF 8 请使用std use facet http en cppreference com w cpp locale use fa
  • laravel:在 null 上调用成员函数 delete()

    当我尝试通过单击删除按钮向帖子添加删除功能时 出现此错误 我哪里做错了 删除PostController中的post函数 public function getDeletePost post id post Post where id po
  • 在 bash 中将数组作为参数传递

    如何将数组作为参数传递给 bash 函数 你可以通过多个数组作为参数使用这样的东西 takes ary as arg declare a argAry1 1 echo argAry1 declare a argAry2 2 echo arg
  • 在 IOStreams 库中使用ignore(numeric_limits::max()) 是否可以处理任意大量的流?

    在 C 标准 第 27 6 1 3 24 节 中 对于 流媒体ignore IOStreams 库中的函数 这意味着如果您为 n 提供一个参数numeric limits max 它将继续忽略字符 永远直到找到分隔符 甚至远远超出实际 流大
  • Scala 的元组展开的细微差别

    当尝试将元组展开为 val 时 我注意到 scala 中的以下行为 scala gt val A B C 1 2 3
  • 应用程序未在发布模式下进入 Posix 信号处理程序

    我正在尝试在 Linux Arm 设备上正常关闭我的控制台应用程序 发送的信号是SIGTERM 我用新的实现了 Posix 信号处理程序PosixSignalRegistration Create https learn microsoft