Azure Web App Windows 容器在正常关闭前终止
Azure Web App Windows Container Terminated before gracefull shutdown
我创建了一个 .NET Framework 控制台程序,它启动并运行一些代码,然后在退出时它应该在退出之前注销任何外部服务(正常关闭)。
这是一个示例程序:
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;
}
}
}
我原以为 Windows 容器 运行 作为 Azure 应用服务会触发“docker 停止”之类的函数,这会将 SIGTERM 发送到我的应用程序。
但是发生的事情是 Azure Web App Windows 容器在尝试停止容器 1 秒后终止。如何要求 Azure Web App 在终止 windows 容器之前等待 X 秒?
拦截 SIGTERM
事件目前不受支持。由于 App Service 是为 HTTP 工作负载量身定制的,所以我很好奇让控制台应用程序接收此类事件的原因。如果您可以进一步详细说明,可能会有替代方案,例如 运行 您的控制台应用程序作为 Web 作业。
我们目前正在为 Azure App Service 上的 Windows 容器发出进程停止信号。
在 Azure 应用服务中,我们将默认等待容器在关闭时退出 5 秒,但我们将允许使用以下应用设置对其进行配置:WEBSITES_CONTAINER_STOP_TIME_LIMIT,我们将允许等待到 2 分钟 (WEBSITES_CONTAINER_STOP_TIME_LIMIT=00:02:00)
此功能将在下一次更新推出时部署,我希望明年初在全球范围内可用,一旦推出,我们也会更新我们的文档,敬请期待。
我创建了一个 .NET Framework 控制台程序,它启动并运行一些代码,然后在退出时它应该在退出之前注销任何外部服务(正常关闭)。
这是一个示例程序:
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;
}
}
}
我原以为 Windows 容器 运行 作为 Azure 应用服务会触发“docker 停止”之类的函数,这会将 SIGTERM 发送到我的应用程序。
但是发生的事情是 Azure Web App Windows 容器在尝试停止容器 1 秒后终止。如何要求 Azure Web App 在终止 windows 容器之前等待 X 秒?
拦截 SIGTERM
事件目前不受支持。由于 App Service 是为 HTTP 工作负载量身定制的,所以我很好奇让控制台应用程序接收此类事件的原因。如果您可以进一步详细说明,可能会有替代方案,例如 运行 您的控制台应用程序作为 Web 作业。
我们目前正在为 Azure App Service 上的 Windows 容器发出进程停止信号。
在 Azure 应用服务中,我们将默认等待容器在关闭时退出 5 秒,但我们将允许使用以下应用设置对其进行配置:WEBSITES_CONTAINER_STOP_TIME_LIMIT,我们将允许等待到 2 分钟 (WEBSITES_CONTAINER_STOP_TIME_LIMIT=00:02:00)
此功能将在下一次更新推出时部署,我希望明年初在全球范围内可用,一旦推出,我们也会更新我们的文档,敬请期待。