当我执行docker stop xxx的时候我希望这个xxx程序是正常退出的,因为我会在退出的时候做一些操作。
我搜索了一些答案,据说docker stop是使用SIGTERM信号来退出程序的。
然后我就监听了AppDomain.Current.ProcessExit事件,测试之后并没有看到输出。
代码如下
class Program
{
static void Main(string[] args)
{
var cts = new CancellationTokenSource();
Console.WriteLine("Hello World!");
var bgtask = Task.Run(() => { TestService.Run(cts.Token); });
AppDomain.CurrentDomain.ProcessExit += (s, e) =>
{
Console.WriteLine($"{DateTime.Now} 后台测试服务,准备进行资源清理!");
cts.Cancel(); //设置IsCancellationRequested=true,让TestService今早结束
bgtask.Wait(); //等待 testService 结束执行
Console.WriteLine($"{DateTime.Now} 恭喜,Test服务程序已正常退出!");
Environment.Exit(0);
};
Console.WriteLine($"{DateTime.Now} 后端服务程序正常启动!");
bgtask.Wait();
}
}
ENTRYPOINT dotnet Demo.dll
修改为
ENTRYPOINT ["dotnet", "Demo.dll"]
设置entrypoint这是docker下dotnetcore能收到退出信号的必要条件.
然后ConsoleApplication现在已经有通用Host可以用了.
目前我所有的项目都是模块化开发, 最终由Host项目选择模块进行部署.
建议试试 IApplicationLifetime ,详见 Application Shutdown in ASP.NET Core with IApplicationLifetime
public void Configure(IApplicationBuilder app, IApplicationLifetime applicationLifetime)
{
applicationLifetime.ApplicationStopping.Register(OnShutdown);
}
private void OnShutdown()
{
//...
}
https://q.cnblogs.com/q/148934
dudu大佬,请教一个类似的问题,有空的话烦请看下有没有遇到类似的问题,万分感谢~~