获得 SIGTERM 信号后是否可以恢复中断的进程?

如何解决获得 SIGTERM 信号后是否可以恢复中断的进程?

在下面的程序中,我想要实现的是,当我按 Ctrl+C 或给 SIGTERM 时,我想让“isEnable”为假,让 while 循环最后一次执行它的代码并优雅地退出程序。 我只能使用 CancelKeyPress 来实现这一点,因为在此处理程序上传递的 EventArgs 具有 Cancel 属性,我只需要将其设置为 true。而且,CancelKeyPress 只处理 Ctrl+C。但是,当我收到 SIGTERM 信号时,我想要同样的东西。

有谁知道在收到 SIGTERM 信号后是否可以像在 CancelKeyPress 中一样恢复进程?

如果您需要更多信息来理解我的问题,请告诉我。

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            bool isEnable = true;

            Console.CancelKeyPress += (s,e) =>
            {
                e.Cancel = true;
                isEnable = false; // making while loop false
                Console.WriteLine("Inside CancelKeyPress");
            };

            AppDomain.CurrentDomain.ProcessExit += (s,e) =>
            {
                isEnable = false;  // making while loop false
                Console.WriteLine("AppDomain ProcessExit!");
            };

            while (isEnable)
            {
                Console.WriteLine("first");
                Thread.Sleep(3000);
                Console.WriteLine("Second");
                Thread.Sleep(3000);
                Console.WriteLine("Third");
                Thread.Sleep(3000);
                Console.WriteLine("Fourth");
                Thread.Sleep(3000);
            }

            Console.WriteLine("Gracefull Shotdown");

        }
    }

解决方法

SIGTERM 是一种要求程序正常终止的“礼貌”方式。

然后程序可以按照它希望的任何方式处理。

  • 它可以忽略它
  • 它可以立即关闭
  • 它可以完成当前任务的处理,然后优雅地 关闭(与数据库断开连接、关闭文件等)。
  • 它可以等待多久,然后关闭。

(如果在 Kubernetes 下运行,那么您可以配置 K8s 在发送 SIGTERM 和 SIGKILL 之间将等待多长时间。因此,如果您的应用需要 10 分钟关闭,那么您可以进行配置,这被认为是完全可以接受的。)

>

在上面的代码中,您不是在“恢复处理”,而是通过有效地忽略 CTRL-C 请求来选择在您的程序中捕获并处理它。

因此,在其他平台上收到 SIGTERM 时,您也没有理由不能这样做。

您可能会发现这篇文章很有帮助: https://medium.com/@rainer_8955/gracefully-shutdown-c-apps-2e9711215f6d

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?