.NET Core 中的跨平台后台服务(想想 windows 服务/unix 守护进程)?

Posted

技术标签:

【中文标题】.NET Core 中的跨平台后台服务(想想 windows 服务/unix 守护进程)?【英文标题】:Cross-platform background service in .NET Core (think windows service/unix daemon)? 【发布时间】:2017-07-17 22:08:14 【问题描述】:

所以我有一个由 API 和 Windows 服务(由 Topshelf 包装)组成的应用程序,它使用 RabbitMQ 持续监听事件并按需处理数据。

为了教育和娱乐,我正在尝试将其重写为可在 .NET Core 和 unix 上运行的等效设置(例如,在 AWS 上的 docker 容器中)

如果我想跨平台使用 .NET Core 来实现类似 Windows 服务(永远运行的后台进程)的最佳方式是什么?

【问题讨论】:

对此也很感兴趣。 这与任何实用的东西相去甚远。将其移植到 Windows 是他们的首要任务,set of patches 已于 3 个月前提交,并为 v2.1.0 设置了里程碑。但是仍然缺少一堆不容易替换的东西。永远不会有 InstallUtil.exe 和对 ServiceInstaller 的支持,这可能会被 sc.exe 所限制。我想说的更关键的是缺少对 EventLog 的支持。当它不能做一些基本的事情,比如记录启动失败时,很难创建一个可用的服务。 【参考方案1】:

请参阅 Worker 服务 (.NET Core 3.x):

您可以从新的 Visual Studio 2019 Worker Service 项目模板或使用 .NET CLI 创建一个:

dotnet new worker

另请参阅: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-3.1&tabs=visual-studio

【讨论】:

【参考方案2】:

Windows 服务本身就是一个控制台应用程序,它符合 Windows 服务控制管理器的接口规则和协议。您可以在两个平台上使用 .net 核心控制台应用程序作为主机来实现相同的功能。它需要做一些额外的配置以使其表现得更像一个真正的服务/守护进程。

Linux

例如对于 Linux,您可以使用 SystemD。 您需要先创建一个类似这样的 SystemD 配置文件:

[Unit]
Description=daemon service
After=network.target

[Service]
ExecStart=/usr/bin/dotnet $(pwd)/bin/daemonsrv.dll 10000
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

然后配置 SystemD 让它知道你的服务配置

# Copy service file to a System location
sudo cp daemonsrv.service /lib/systemd/system

# Reload SystemD and enable the service, so it will restart on reboots

sudo systemctl daemon-reload 
sudo systemctl enable daemonsrv

# Start service
sudo systemctl start daemonsrv

# View service status
systemctl status daemonsrv

窗口

对于 Windows,您应该使用不同的工具集做大部分相同的操作。您将不得不使用第三方服务管理器来避免紧密的窗口绑定。 例如。你可以使用NSSM。这是一篇不错的文章,其中包含有关它的示例 - .Net Core console application as a Windows Service。

顺便说一句,在 Windows 的情况下,您仍然可以将正常的 Windows 服务设置用作主机。并为您的 Unix 环境编写另一个主机(控制台应用程序主机)。它们都可以共享业务逻辑,只是它们对系统事件的反应方式会有所不同。

希望对你有帮助。

【讨论】:

感谢您的解释。例如,是否可以在 .NET Core 控制台应用程序中对 sudo systemctl stop daemonsrv 实现清理回调? 是的,我相信您应该能够挂接到控制台退出事件并在必要时从那里执行清理操作 试试这个,但也有其他实现wintellect.com/creating-a-daemon-with-net-core-part-1 我正在尝试将所有实现结合起来,最终获得真正的守护进程,该守护进程将在启动时像某些带有 -daemon 标志的 linux 应用程序一样在后台运行 PS 到目前为止,我在 linux linuxize.com/post/how-to-use-linux-screen 上使用“screen”应用程序运行 .net Core 控制台应用程序,足以设置后台运行控制台应用程序,但不是可以通过 SystemD 运行的真正守护程序(通过 hack 除外从 systemctl 运行 .sh 脚本,其中 .sh 脚本具有屏幕命令)

以上是关于.NET Core 中的跨平台后台服务(想想 windows 服务/unix 守护进程)?的主要内容,如果未能解决你的问题,请参考以下文章

负载平衡环境中的 .Net Core 托管服务

.Net Core中的通用主机——托管服务

.NET Core 一键部署到Linux服务器以服务方式后台运行

2022年11月 influxDB数据库-.Net Core中的使用

2022年11月 influxDB数据库-.Net Core中的使用

ASP.NET Core 6框架揭秘实例演示[21]:如何承载你的后台服务