.NET Core中的跨平台后台服务(类似于Windows服务/Unix守护进程)?

42

我有一个应用,由API和一个Windows服务(Topshelf封装)组成,它通过RabbitMQ不断监听事件,并按需处理数据。

出于教育和娱乐目的,我想将其重写为在.NET Core和Unix上运行的等效设置(例如在AWS上的docker容器中)

如果我想保持跨平台,使用.NET Core实现类似于Windows服务(一直运行的后台进程)的等效程序,最好的方法是什么?


2
也对此感兴趣。 - bazzilic
这离实际应用还有很长的路要走。将其移植到Windows是他们的首要任务,三个月前提交了一组补丁(https://github.com/dotnet/corefx/pull/22920),里程碑设置为v2.1.0。但仍有许多缺失的内容不容易替换。将永远不会有InstallUtil.exe和ServiceInstaller的支持,可以使用sc.exe进行修复。我认为更关键的是缺少对EventLog的支持。当无法记录启动失败等基本信息时,很难创建可用的服务。 - Hans Passant
2个回答

21

Windows服务本身是一个遵循Windows服务控制管理器接口规则和协议的控制台应用程序。您可以使用 .NET Core 控制台应用程序作为主机在两个平台上实现相同的功能。但需要进行一些额外的配置,以使其行为更像真正的服务/守护程序。

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

针对 Windows 操作系统,您需要使用不同的工具集来完成相同的任务。为了避免与 Windows 紧密绑定,您需要使用第三方服务管理器。例如,您可以使用 NSSM。这篇文章中提供了关于 NSSM 的详细信息和示例:.Net Core console application as a Windows Service

如果在 Windows 中只是作为一个宿主,您仍然可以使用普通的 Windows 服务设置。而在 Unix 环境中,您需要编写另一个控制台应用程序宿主。两者都可以共享业务逻辑,只是它们响应系统事件的方式不同。

希望这能对您有所帮助。


谢谢您的解释。例如,在.NET Core控制台应用程序中,是否可以实现在sudo systemctl stop daemonsrv上设置清理回调函数? - valorl
是的,我相信你应该能够钩入控制台退出事件,并在必要时执行清理操作。 - n.yakovenko
1
尝试一下这个,但也有其他的实现方式:https://www.wintellect.com/creating-a-daemon-with-net-core-part-1/ 我正在尝试将所有内容组合起来,最终得到真正的守护进程,在启动时像某些带有“-daemon”标志的Linux应用程序一样在后台运行。 - Pawel Cioch
目前我使用 Linux 上的 "screen" 应用程序运行 .net Core 控制台应用程序。这篇文章 https://linuxize.com/post/how-to-use-linux-screen/ 提供了足够好的设置后台运行控制台应用程序,但不是真正的守护进程,不能通过 SystemD 运行(除非通过运行包含 screen 命令的 .sh 脚本的 systemctl hack)。 - Pawel Cioch

6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接