优雅地终止在 Linux 上运行的 .NET Core 守护进程
- 2024-11-07 08:55:00
- admin 原创
- 174
问题描述:
我创建了一个在 Ubuntu 14.04 机器上作为守护进程运行的 .NET Core 控制台应用程序。
我想在不强制执行的情况下停止该服务,能够处理终止事件。
我怎样才能实现这个目标?
解决方案 1:
自一年前@Stefano 的回答以来,.NET Core 已经有了长足的发展。在 .NET Core 2.0 中,您现在可以使用众所周知的AppDomain.CurrentDomain.ProcessExit
事件代替AssemblyLoadContext.Default.Unloading
。它适用于 Linux 上的控制台应用程序,也适用于 Docker。
解决方案 2:
您希望能够向正在运行的进程发送SIGTERM :
kill <PID>
并且该进程应该处理它以正确关闭。
不幸的是,.NET Core没有很好的文档记录,但它能够处理 Unix 信号(与Mono 的方式不同)。GitHub问题
如果你使用Ubuntu和Upstart,你需要一个 init 脚本,在收到停止请求时发送kill信号:示例 init 脚本
向您的project.json添加依赖项:
"System.Runtime.Loader": "4.0.0"
这将为您提供AssemblyLoadContext。
然后你就可以处理 SIGTERM 事件:
AssemblyLoadContext.Default.Unloading += MethodInvokedOnSigTerm;
笔记:
使用 Mono,正确的处理方式是通过UnixSignal:Mono.Unix.Native.Signum.SIGTERM
编辑:
正如@Marc在他最近的回答中指出的那样,这不再是实现这一目标的最佳方式。从.NET Core 2.0 AppDomain.CurrentDomain.ProcessExit
开始,支持该事件。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD