优雅地杀死在 Linux 上运行的 .NET Core 守护进程

本文关键字:运行 NET Core 进程 守护 Linux | 更新日期: 2023-09-27 17:56:15

我创建了一个在 Ubuntu 14.04 机器上作为守护程序运行的 .NET Core 控制台应用程序。

我想在不强制的情况下停止服务,能够处理终止事件。

我怎样才能做到这一点?

优雅地杀死在 Linux 上运行的 .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 问题

如果你将 UbuntuUpstart 一起使用,你需要的是一个 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是受支持的事件。