我在Ubuntu 14.04计算机上创建了一个作为守护程序运行的.NET Core控制台应用程序。
我想在不强制服务的情况下停止服务,能够处理杀戮事件。
我怎样才能做到这一点?
答案 0 :(得分:40)
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
是受支持的事件。