正好杀死在Linux上运行的.NET Core守护程序

时间:2016-07-10 11:51:33

标签: c# linux service daemon .net-core

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

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

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:40)

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

答案 1 :(得分:26)

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

kill <PID>

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

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

如果您将 Ubuntu Upstart 一起使用,您需要的是拥有一个init脚本,该脚本会在停止请求中发送 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是受支持的事件。