gpt4 book ai didi

c# - 使用 .NET Core 应用程序优雅地处理 AWS ECS 停止任务

转载 作者:太空狗 更新时间:2023-10-29 23:49:07 26 4
gpt4 key购买 nike

我编写了一个 .NET 核心控制台应用程序作为 AWS ECS Fargate 中的任务运行。基本上,控制台应用程序启动一个处理线程,然后只需要继续运行(很像 Kestrel 网络主机。)

最初,我放入一个 Console.ReadKey() 并认为它永远不会命中并且应用程序将继续运行。那么这会导致 .NET 异常...

Cannot read keys when either application does not have a console 
or when console input has been redirected. Try Console.Read.

然后我将 ReadKey 替换为 Console.Read()。应用程序就像它不存在一样,继续移动,应用程序一启动就退出。

通过研究,我发现了 Console.CancelKeyPress 事件。我实现了它,它的工作原理是控制台应用程序将继续运行。

ManualResetEvent _quitEvent = new ManualResetEvent(false);
Console.CancelKeyPress += (sender, eArgs) => {
Console.WriteLine("Shutting down.");
_quitEvent.Set();
eArgs.Cancel = true;
};
_quitEvent.WaitOne();

但我想在这种情况确实发生时优雅地处理应用程序的关闭。

通过其他研究,我发现当 AWS ECS 停止任务时,它不会发送 Ctrl-C (SIGINT),而是发送 SIGTERM。 https://docs.aws.amazon.com/cli/latest/reference/ecs/stop-task.html

然后我在 .NET 中实现我认为是 SIGTERM 的标准事件处理(见下文。)

AssemblyLoadContext.Default.Unloading += ctx =>
{
Console.WriteLine("Shutting down.");
_quitEvent.Set();
};
_quitEvent.WaitOne();

这在 ECS 中编译和运行良好。但是...我通过 AWS ECS 控制台点击了“停止”按钮,它停止了任务并重新启动了一个新任务。当我查看那个已停止任务的日志时,没有关闭日志消息,没有正常关闭的指示,什么都没有。看来只是被强行杀死了。

我是不是漏掉了什么?我可以做些什么不同的事情来优雅地捕获 AWS ECS 中的停止任务以优雅地关闭任务?

最佳答案

这似乎与处理正常关机的 .net 代码有关。我刚刚在本地使用以下代码、docker 和 ECS Stop-Task 进行了测试。在所有地方,我都收到了正常关机。我没有您的完整代码,所以我创建了自己的示例。

using System;
using System.Runtime.Loader;
using System.Threading;

namespace consoleapp
{
class Program
{
static void Main(string[] args)
{
var _quitEvent = new ManualResetEvent(false);
AssemblyLoadContext.Default.Unloading += ctx =>
{
System.Console.WriteLine("Unloding fired");
_quitEvent.Set();
};
System.Console.WriteLine("Waiting for signals");
_quitEvent.WaitOne();
System.Console.WriteLine("Received signal gracefully shutting down");
Console.WriteLine("Hello World!");
}
}
}

如果您想自己尝试,请参阅完整的 github 存储库引用。 https://github.com/imran9m/netconsoleapp.git

您应该看到的容器示例日志。

Waiting for signals

Unloding fired

Received signal gracefully shutting down

Hello World!

注意 - 要在本地测试 SIGTERM 信号,您需要在 dotnet CLI 上运行 kill -SIGTERM {PID} 而不是 CTRL+C。

关于c# - 使用 .NET Core 应用程序优雅地处理 AWS ECS 停止任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53784213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com