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

Killing gracefully a .NET Core daemon running on Linux

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

我想停止服务而不强制它,能够处理终止事件。

我怎样才能做到这一点?

您希望能够向 运行 进程发送 SIGTERM

kill <PID>

并且进程应该处理它以正确关闭。

不幸的是 .NET Core 没有很好的文档记录,但它能够处理 Unix 信号(与 Mono 的方式不同) . GitHub issue

如果您将 UbuntuUpstart 一起使用,您需要一个初始化脚本来发送 kill 停止请求信号:Example init script

为您的 project.json 添加依赖项:

"System.Runtime.Loader": "4.0.0"

这将为您提供 AssemblyLoadContext

然后就可以处理SIGTERM事件了:

AssemblyLoadContext.Default.Unloading += MethodInvokedOnSigTerm;

注:

使用 Mono,正确的处理方式是通过 UnixSignalMono.Unix.Native.Signum.SIGTERM

编辑:

正如@Marc 在他最近的回答中指出的那样,这不再是实现这一目标的最佳方式。来自 .NET Core 2.0 AppDomain.CurrentDomain.ProcessExit 是支持的事件。

.NET Core 自一年前 @Stefano 的回答以来已经有了很大的发展。在 .NET Core 2.0 中,您现在可以使用众所周知的 AppDomain.CurrentDomain.ProcessExit 事件而不是 AssemblyLoadContext.Default.Unloading。它适用于 Linux 上的控制台应用程序,也适用于 Docker.