如何解决获得 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 举报,一经查实,本站将立刻删除。