优雅地杀死在 Linux 上运行的 .NET Core 守护进程
·
问题:优雅地杀死在 Linux 上运行的 .NET Core 守护进程
我创建了一个在 Ubuntu 14.04 机器上作为守护进程运行的 .NET Core 控制台应用程序。
我想停止服务而不强制它,能够处理终止事件。
我怎样才能做到这一点?
解答
您希望能够向正在运行的进程发送 SIGTERM:
kill <PID>
并且该过程应该处理它以正确关闭。
不幸的是,.NET Core 没有很好的文档记录,但它能够处理 Unix 信号(以与 Mono 不同的方式)。GitHub问题
如果您将 Ubuntu 与 Upstart 一起使用,您需要有一个在停止请求时发送 kill 信号的 init 脚本:Example init script
向您的 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是受支持的事件。
更多推荐

所有评论(0)