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

NET核心中的跨平台后台服务(想想windows服务/unix守护进程)?,unix,cross-platform,.net-core,daemon,Unix,Cross Platform,.net Core,Daemon,因此,我有一个应用程序,它由一个API和一个Windows服务(由Topshelf包装)组成,该服务使用RabbitMQ持续侦听事件并按需处理数据 为了教育和娱乐,我正试图将其改写成一个在.NET Core和unix上运行的等效设置(例如,在AWS上的docker容器中) 实现类似windows服务(永远运行后台进程)的最佳方法是什么如果我想让它跨平台使用.NET Core?Windows服务本身是一个控制台应用程序,它符合Windows服务控制管理器的接口规则和协议。使用.net核心控制台应用

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

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


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

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

Linux 例如,对于Linux,您可以使用。 您首先需要创建一个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服务设置,就像windows应用程序中的主机一样。并为您的Unix环境编写另一个主机(控制台应用程序主机)。它们都可以共享业务逻辑,只有它们对系统事件的反应方式不同

希望有帮助。

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

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

dotnet新员工

另见:

对此也感兴趣。这离任何实用的东西都有很长很长的路要走。将其移植到Windows是他们的首要任务,三个月前,他们承诺了一项计划,并为v2.1.0设定了里程碑。但仍有一大堆东西不见了,不容易更换。永远不会有InstallUtil.exe和对ServiceInstaller的支持,这可以通过sc.exe实现。我认为更关键的是缺少对EventLog的支持。当无法完成诸如记录启动失败之类的基本工作时,很难创建可用的服务。感谢您的解释。例如,是否可能在.NET Core控制台应用程序中的
sudo systemctl stop daemonsrv
上实现清理回调?是的,我相信您应该能够挂接到控制台退出事件,并在必要时从那里执行清理操作尝试一下,但也有其他的实现,我正在尝试将所有实现结合起来,最终得到真正的守护进程,它将在启动时在后台运行,就像某些linux应用程序使用-daemon flagPS一样。到目前为止,我使用“screen”运行.net核心控制台应用程序linux上的应用程序足以设置后台运行控制台应用程序,但不是可以通过SystemD运行的真正守护进程(除了通过从systemctl运行.sh脚本的hack,其中.sh脚本有screen命令)