Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 优雅地杀死Linux上运行的.NET核心守护程序_C#_Linux_Service_Daemon_.net Core - Fatal编程技术网

C# 优雅地杀死Linux上运行的.NET核心守护程序

C# 优雅地杀死Linux上运行的.NET核心守护程序,c#,linux,service,daemon,.net-core,C#,Linux,Service,Daemon,.net Core,我创建了一个.NET核心控制台应用程序,在Ubuntu 14.04机器上作为守护进程运行 我想在不强制的情况下停止服务,以便能够处理终止事件 如何实现这一点?您希望能够向正在运行的进程发送SIGTERM: kill <PID> 这将为您提供AssemblyLoadContext 然后可以处理SIGTERM事件: AssemblyLoadContext.Default.Unloading += MethodInvokedOnSigTerm; 注: 使用Mono,正确的处理方法是通过

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

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


如何实现这一点?

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

kill <PID>
这将为您提供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.Unload
。它适用于Linux上的控制台应用程序,也适用于Docker中的控制台应用程序。

如果应用程序自行正常停止,则此功能正常。但是如果调用kill命令,它不会触发“AssemblyLoadContext.Default.unload”。我做错什么了吗?你使用的是什么版本的.NET Core?您是否正在修改加载上下文?版本:1.0.0-preview2-003121。。。我还注意到,当我运行“dotnetrun”时,它会启动两个进程。我认为这就是它无法工作的原因,因为它会杀死其中一个进程,但不会同时杀死两个进程。请尝试访问已发布的DLL文件夹,并使用:
dotnet.DLL
(不运行)运行,该文件夹应只运行一个进程,您可以尝试杀死该进程。谢谢。是的,这和我让它工作的方式很相似。我唯一的不同是“dotnet exec.dll”。想分享你的代码吗?把一个.NET核心控制台应用程序变成一个Ubuntu守护程序?我做的唯一一件事就是从GitHub复制一个默认的初始化脚本;start函数调用
dotnet library.dll
,stop函数调用:
kill dotnet library.dll
。我举了一个简单的例子说明如何处理这个事件:
AppDomain.CurrentDomain.ProcessExit
只允许2秒钟的清理,而且没有办法用托管代码覆盖它。@Parag我想你误读了文档,或者它已经被更改了。此时间限制仅适用于.NET Framework,而不适用于.NET Core@我确信它适用于.net内核。检查您发送的文档链接中的“应用于”部分。@Parag这篇文章是关于ProcessExit事件的,而不是时间限制。在紫色的注释框中,它清楚地表明.NETCore中不存在时间限制,我很惊讶您会错过它。
AssemblyLoadContext.Default.Unloading += MethodInvokedOnSigTerm;