优雅地杀死在 Linux 上运行的 .NET Core 守护进程
本文关键字:运行 NET Core 进程 守护 Linux | 更新日期: 2023-09-27 17:56:15
我创建了一个在 Ubuntu 14.04 机器上作为守护程序运行的 .NET Core 控制台应用程序。
我想在不强制的情况下停止服务,能够处理终止事件。
我怎样才能做到这一点?
自
一年前@Stefano的回答以来,.NET Core已经有了很大的发展。在 .NET Core 2.0 中,现在可以使用已知的 AppDomain.CurrentDomain.ProcessExit
事件,而不是 AssemblyLoadContext.Default.Unloading
。它适用于Linux上的控制台应用程序,在Docker中也是如此。
您希望能够将 SIGTERM 发送到正在运行的进程:
kill <PID>
并且该过程应处理它以正确关闭。
不幸的是,.NET Core没有很好的文档记录,但它能够处理Unix信号(以与Mono不同的方式)。GitHub 问题
如果你将 Ubuntu 与 Upstart 一起使用,你需要的是一个 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
是受支持的事件。