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

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

我怎样才能做到这一点?

推荐答案

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

kill <PID>

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

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

如果使用UbuntuUpstart,则需要一个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

EDIT:

正如@Marc在最近的回答中指出的,这不再是实现这一目标的最佳方式.From .NET Core 2.0 AppDomain.CurrentDomain.ProcessExit是受支持的事件.

Linux相关问答推荐

Aarch64在Linux上是否有红色区域,如果有,是16个字节还是128个字节?

如何使用 sed 和 date 命令替换和格式化字符串中的日期?

awk内部的变量操作

8 个半小时范围的 Crontab 表达式

linux shell获取多文件交集

有必要注意非错误提示吗?好像没有找到包裹‘***’?

在 Ansible 中使用 JSON 查询过滤数据以从 ansible_fact 中提取数据

如何使用 Bash 读取文件中的倒数第二行?

在 Linux 下将 TCP 流量重定向到 UNIX 域套接字

如何使用完整路径或文件名显示 grep 结果

如何使用不同的出口 IP 一次运行多个 Tor 进程?

如何将整个文件夹从 Amazon EC2 Linux 实例复制到本地 Linux 机器?

如何像 Nautilus 那样从命令行挂载?

在 bash 中检测公共 IP 地址的方法

PuTTY:更改默认 SSH 登录目录

C ++中套接字上的协议缓冲区

to_string不是std的成员?

Bash:如何标记字符串变量?

如何为 Git 命令设置自动完成功能?

如何计算一个单词在目录的所有文件中出现的次数?