azure-web-app-service - Azure Web App Windows 容器在正常关闭之前终止
问题描述
我创建了一个 .NET Framework Console 程序,它启动并运行一些代码,然后在退出时它应该在退出之前注销任何外部服务(正常关闭)。
这是一个示例程序:
using System;
using System.Runtime.InteropServices;
using System.Threading;
namespace delayed_shutdown
{
class Program
{
public enum CtrlTypes
{
CTRL_C_EVENT = 0,
CTRL_BREAK_EVENT,
CTRL_CLOSE_EVENT,
CTRL_LOGOFF_EVENT = 5,
CTRL_SHUTDOWON_EVENT
}
[DllImport("Kernel32")]
public static extern bool SetConsoleCtrlHandler(HandlerRoutine handler, bool Add);
public delegate bool HandlerRoutine(CtrlTypes CtrlType);
public static volatile HandlerRoutine handlerRoutine = new HandlerRoutine(ConsoleCtrlCheck), true)
public static volatile ManualResetEvent exitEvent = new ManualResetEvent(false);
public static bool ConsoleCtrlCheck(CtrlTypes ctrlType)
{
switch (ctrlType)
{
case CtrlTypes.CTRL_C_EVENT:
Console.WriteLine("CTRL_C received");
exitEvent.Set();
return true;
case CtrlTypes.CTRL_CLOSE_EVENT:
Console.WriteLine("CTRL_CLOSE received");
exitEvent.Set();
return true;
case CtrlTypes.CTRL_BREAK_EVENT:
Console.WriteLine("CTRL_BREAK received");
exitEvent.Set();
return true;
case CtrlTypes.CTRL_LOGOFF_EVENT:
Console.WriteLine("CTRL_LOGOFF received");
exitEvent.Set();
return true;
case CtrlTypes.CTRL_SHUTDOWON_EVENT:
Console.WriteLine("CTRL_SHUTDOWN received");
exitEvent.Set();
return true;
default:
return false;
}
}
static int Main(string[] args)
{
if (!SetConsoleCtrlHandler(handlerRoutine))
{
Console.WriteLine("Error setting up control handler... :(");
return -1;
}
Console.WriteLine("Waiting for control event...");
exitEvent.WaitOne();
var i = 60;
Console.WriteLine($"Exiting in {i} seconds...");
while (i > 0)
{
Console.WriteLine($"{i}");
Thread.Sleep(TimeSpan.FromSeconds(1));
i--;
}
Console.WriteLine("Goodbye");
return 0;
}
}
}
我本来希望作为 Azure 应用服务运行的 Windows 容器触发类似“docker stop”的功能,这会将 SIGTERM 发送到我的应用程序。
但发生的情况是 Azure Web App Windows 容器在尝试停止容器 1 秒后终止。如何要求 Azure Web App 在终止 Windows 容器之前等待 X 秒?
解决方案
我们目前正在为 Azure 应用服务上的 Windows 容器在停止时发出信号。
在 Azure 应用服务中,我们将默认为 5 秒以等待容器在关闭时退出,但我们将允许使用以下应用设置进行配置:WEBSITES_CONTAINER_STOP_TIME_LIMIT 并且我们将允许最多等待 2 分钟(WEBSITES_CONTAINER_STOP_TIME_LIMIT=00:02 :00)
此功能将在下一次更新发布中部署,我希望明年初在全球范围内可用,一旦发布,我们也会更新我们的文档,敬请期待。
推荐阅读
- php - 是否有 Ruby 的 WebMock 的 PHP 等价物?
- javascript - jquery.min.js:2 Uncaught TypeError: $(...).select2 is not a function
- dart - 切换到 IOS 时颤振检查器崩溃
- javascript - 如何从 API 获取一定数量的 JSON 数据?
- sql - 在oracle sqlplus中选择以'n'结尾的单词
- jquery - SQLSTATE [42S22]:未找到列:1054 'order 子句'中的未知列'1'(SQL:select * from `item` order by `1` asc limit 10 offset 0)
- bash - Centos systemctl 启动脚本 - Ruby 错误解释器
- swift - Swift Codable 多种类型
- c# - 错误:当前的 .NET SDK 不支持面向 .NET Standard 2.0
- c# - Dropzone 服务器在 iOS 上以 0 代码响应