【问题标题】:is it possible to resume the interrupted process after getting SIGTERM singal?收到 SIGTERM 信号后是否可以恢复中断的进程?
【发布时间】:2021-04-09 03:04:05
【问题描述】:

在下面的程序中,我想要实现的是当我按下 Ctrl+C 或给出 SIGTERM 时,我想将 'isEnable' 设为 false 并让 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");

        }
    }

【问题讨论】:

  • C# 以 Windows 为中心,Windows 没有 SIGTERM 等 POSIX 信号。 Ctrl-C 和 Ctrl-Break 的处理方式大致相似,但仅此而已。我想知道它在 Linux 主机上运行时是否支持信号。 +1
  • @ikegami 我在 dotnet core 中编写了这个应用程序,并在 linux 框中运行了代码,然后给出了“kill -15 ”。那时它调用 AppDomain.CurrentDomain.ProcessExit 并终止应用程序而不是恢复之前的任务。
  • Re "当时它调用了 AppDomain.CurrentDomain.ProcessExit 并终止了应用程序",取消事件(e.Cancel = true;)不会阻止退出吗?

标签: c# .net event-handling console-application


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-04-28
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    相关资源
    最近更新 更多