当前位置: 首页 > 面试题库 >

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

唐康安
2023-03-14
问题内容

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

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

我该如何实现?


问题答案:

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

kill <PID>

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

不幸的是, .NET Core的 文档不完善,但是它能够处理Unix信号(与 Mono的
方式不同)。GitHub问题

如果将 UbuntuUpstart 一起使用,则需要一个初始化脚本,该脚本在停止请求上发送 kill
信号:初始化脚本示例

向您的 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是受支持的事件。



 类似资料:
  • 我试图在我的Android应用程序中执行ping命令,并能够取消它/发送中断信号。基本上,我希望在任何普通的linux中,当你发送ctrl c到ping时,都能得到ping统计数据。我读过Send Ctrl-C to process open by Java,但它针对的是Windows平台,而tbh似乎有点过头了。我执行命令的代码(我使用的是rxjava): 以及开始/取消: 到目前为止,我试图终

  • 我有一个用PHP编写的守护进程(不是最好的语言,但与我一起工作),它用于从队列接收作业,并在需要完成作业时处理它们。对于每个新作业,我使用pcntl_fork()将作业分叉到子进程中。在这个子进程中,我然后使用proc_open()执行用于音频转码的长时间运行的系统命令,完成后直接返回到子进程。作业完成后,子进程退出并由父进程清理。 为了保持这个守护进程始终运行,我使用upstart。这是我的暴发

  • 我使用Spring Boot Gradle插件启动Tomcat服务器&我的应用程序。我通过启动Tomcat服务器。我还启用了Gradle守护进程,希望能让Gradle构建更快。

  • 问题内容: 我正在编写Linux守护程序。我发现了两种方法。 通过调用和设置守护进程。 使用运行程序。 哪个是正确的方法? 问题答案: 来自http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16 以下是成为守护程序的步骤: 1. fork(),以便父级可以退出,这会将控制权返回给命令行或shell来调用您的程序。需要执行此步骤,以确保新流程不

  • 我试图使用tomcat目录中的关闭tomcat。但发现服务器没有正确关闭。因此无法重新启动 我的tomcat正在端口上运行。 我想杀死在上运行的tomcat进程。我首先想要拥有在特定端口(8080)上运行的进程列表,以便选择要杀死哪个进程。

  • 本文向大家介绍linux下的守护进程,包括了linux下的守护进程的使用技巧和注意事项,需要的朋友参考一下 Linux下的常驻进程的作用不可忽略,但这里面的问题也不能忽略,怎么启动进程,怎么结束进程,怎么在进程挂掉之后重启进程都要设计的合理。下面看一个shell控制的php常驻进程的例子。 不废话,直接捞干货,上代码,通过代码来讲解更容易理解: 只里面有几个要强调的地方: 我用这个shell去调用