Я написал консольное приложение ядра .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
Затем я реализую стандартную обработку событий для SIGTERM в .NET (см. Ниже).
AssemblyLoadContext.Default.Unloading += ctx =>
{
Console.WriteLine("Shutting down.");
_quitEvent.Set();
};
_quitEvent.WaitOne();
Это компилируется и нормально работает в ECS.НО ... Я нажал кнопку "Стоп" через консоль AWS ECS, она останавливает задачу и перезапускает новую задачу.Когда я просматриваю журнал этой остановленной задачи, там нет сообщения журнала выключения, никаких признаков постепенного выключения, ничего.Похоже, что его просто убили силой.
Я что-то здесь упустил?Что я могу сделать по-другому, чтобы изящно перехватить стоп-задачу в AWS ECS и изящно завершить задачу?