在 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
如果您将 Ubuntu 与 Upstart 一起使用,您需要一个初始化脚本来发送 kill 停止请求信号: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
是支持的事件。
.NET Core 自一年前 @Stefano 的回答以来已经有了很大的发展。在 .NET Core 2.0 中,您现在可以使用众所周知的 AppDomain.CurrentDomain.ProcessExit
事件而不是 AssemblyLoadContext.Default.Unloading
。它适用于 Linux 上的控制台应用程序,也适用于 Docker.
我在 Ubuntu 14.04 机器上创建了一个 .NET Core 控制台应用程序 运行 作为守护进程。
我想停止服务而不强制它,能够处理终止事件。
我怎样才能做到这一点?
您希望能够向 运行 进程发送 SIGTERM:
kill <PID>
并且进程应该处理它以正确关闭。
不幸的是 .NET Core 没有很好的文档记录,但它能够处理 Unix 信号(与 Mono 的方式不同) . GitHub issue
如果您将 Ubuntu 与 Upstart 一起使用,您需要一个初始化脚本来发送 kill 停止请求信号: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
是支持的事件。
.NET Core 自一年前 @Stefano 的回答以来已经有了很大的发展。在 .NET Core 2.0 中,您现在可以使用众所周知的 AppDomain.CurrentDomain.ProcessExit
事件而不是 AssemblyLoadContext.Default.Unloading
。它适用于 Linux 上的控制台应用程序,也适用于 Docker.