- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发 .NET Core 3.1 后台服务,该服务将作为守护进程安装在 Debian AWS EC2 实例上。
优雅地关闭守护进程以停止运行任务并完成一些要处理的任务(发送一些事件等)是很重要的。基本实现如下所示:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace MyApp.WorkerService
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).UseSystemd().Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
}
}
你可以看到我在这里使用了 SystemdLifetime
。
worker 如下:
using System;
using System.Threading;
using System.Threading.Tasks;
using AdClassifier.App.Audit;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using NLog;
namespace MyApp.WorkerService
{
public class Worker : BackgroundService
{
private static readonly ILogger Logger = LogManager.GetLogger(typeof(Worker).FullName);
private readonly int _jobPollIntervalMilliseconds;
public IServiceProvider Services { get; }
public Worker(IServiceProvider services, IConfiguration configuration)
{
Services = services;
_jobPollIntervalMilliseconds = configuration.GetValue<int>("JobPollIntervalMilliseconds");
}
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
Logger.Info("Worker running.");
var task = new Task(o => DoWork(stoppingToken), stoppingToken);
task.Start();
return task;
}
public override async Task StopAsync(CancellationToken cancellationToken)
{
Logger.Info("Worker stopping");
await base.StopAsync(cancellationToken);
Logger.Info("Worker stopped");
}
private void DoWork(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
using (var scope = Services.CreateScope())
{
// do some work
}
Thread.Sleep(_jobPollIntervalMilliseconds);
}
Logger.Info("cancellation requested!");
}
}
}
问题
正如我提到的,我们将其设置为守护进程,如下所示
[Unit]
Description=my worker
Requires=deploy-my-worker.service
After=multi-user.target deploy-my-worker.service
ConditionFileIsExecutable=/home/my-worker/current/myworker
[Service]
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
Environment=DOTNET_CLI_TELEMETRY_OPTOUT=true
Environment=ASPNETCORE_URLS=http://*:5000
Environment=DOTNET_ENVIRONMENT=Staging
Environment=ASPNETCORE_ENVIRONMENT=Staging
WorkingDirectory=/home/my-worker/current
ExecStart=/home/my-worker/current/myworker
SyslogIdentifier=my-worker
Restart=always
RestartSec=10
KillSignal=SIGTERM
User=usr
Group=usrgroup
[Install]
WantedBy=multi-user.target
问题是 worker 不会优雅地停止。我正在检查以下日志条目的日志,但它们没有出现:Worker 停止
,取消请求!
,Worker 停止
请注意,该应用程序确实关闭了。我们为关闭服务所做的尝试如下:
systemctl 停止 my-worker.service
杀死
kill -SIGTERM
kill -SIGINT
什么有效
如果我这样启动 worker:usr@ip-10-168-19-126:~/my-worker/current$ ./myworker
然后按 Ctrl-C
(应该是 SIGINT
),应用程序停止,在我的日志中我可以看到正确的消息:
2020-05-21 16:16:57.9676|INFO|MyApp.WorkerService.Worker|Worker stopping
2020-05-21 16:16:57.9937|INFO|MyApp.WorkerService.Worker|cancellation requested!
2020-05-21 16:16:57.9937|INFO|MyApp.WorkerService.Worker|Worker stopped
2020-05-21 16:16:57.9980 Info AppDomain Shutting down. Logger closing...
关于如何让守护进程按预期工作的任何想法?
注意:
我有充分的理由相信问题出在守护程序设置或 UseSystemd()
的某个地方。
我将 UseSystemd()
替换为 UseWindowsService()
并将其作为 Windows 服务安装在 Windows 机器上。然后继续通过“服务”面板启动和停止服务,并按预期看到关闭日志记录。
因此,我很想假设在实现中没有问题,而是在设置中的某个地方。
最佳答案
看来问题出在 NLog 的关闭上。这是通过执行以下操作修复的:LogManager.AutoShutdown = false;
并在 Worker::StopAsync
中添加 LogManager.Shutdown();
关于.net-core - .NET 核心 BackgroundService 没有作为守护进程正常关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61936664/
我知道如何在asp.net core中使用后台服务 public class WatchMan : BackgroundService { } 我有一个点核心控制台应用程序,我想作为窗口服务运
我知道如何在asp.net core中使用后台服务 public class WatchMan : BackgroundService { } 我有一个点核心控制台应用程序,我想作为窗口服务运
所以在 MSDN对于 ASP.Net Core,它向您展示了如何使用托管服务创建后台任务。甚至有一个特定的段落解释了如何创建后台队列。 现在我的问题是,ExecuteAsync 方法是否已经在其自己的
我正在使用 .NET Core 2.2,我想运行一个长时间运行的后台任务(比如旧的 Windows 服务)。我想使用 Microsoft.Extensions.Hosting.BackgroundSe
我正在使用 .NET Core 2.2,我想运行一个长时间运行的后台任务(比如旧的 Windows 服务)。我想使用 Microsoft.Extensions.Hosting.BackgroundSe
我有一个后台 worker 实现了 BackgroundService(由 MS 提供)。 看看这个简单的实现: public class MyService : BackgroundService
我在 Asp.Net Core Web API 中实现了一个 Microsoft.Extensions.Hosting.BackgroundService,它在 ExecuteAsync 内部有一个阻
在 ASP.NET Core 上,我观察到一种奇怪的行为,这实际上在 BackgroundService not shutting down, stoppingToken never set with
我创建了 WcBackgroundService(由 BackgroundService 继承)并将其注入(inject)到 OrdersController。当前端 API 在重启端点上发送请求时,
我有一个名为 Worker 的 BackgroundService,我重写了 ExecuteAsync 方法以每 10 秒运行一次。有时,我跑的东西会持续很长时间。在这种情况下,我想终止正在运行的程序
我创建了一个像这样的 BackgroundService: public class CustomService : BackgroundService { protected overrid
我正在开发 .NET Core 3.1 后台服务,该服务将作为守护进程安装在 Debian AWS EC2 实例上。 优雅地关闭守护进程以停止运行任务并完成一些要处理的任务(发送一些事件等)是很重要的
我目前有一个带有 .NET Core SDK v5.0.403 的 ASP.NET Core 应用程序。 在此应用程序中,我定义了多个 BackgroundService,其中之一如下: public
我目前有一个带有 .NET Core SDK v5.0.403 的 ASP.NET Core 应用程序。 在此应用程序中,我定义了多个 BackgroundService,其中之一如下: public
新的 .NET Core“通用主机”似乎是实现运行多个并发任务的控制台应用程序的不错选择。我认为我可以使用 IHostedService(或 BackgroundService)将它们定义为服务,而不
我在 .net 通用主机中托管了一个 BackgroundService,如下所示: var builder = Host.CreateDefaultBuilder(args); builder
我正在尝试启动分配给 IHostBuilder 的 services.HostedService 的 BackgroundService。 IHostBuilder定义: private static
我正在尝试启动分配给 IHostBuilder 的 services.HostedService 的 BackgroundService。 IHostBuilder定义: private static
我创建了一个从 Microsoft.Extensions.Hosting.BackgroundService 继承的辅助服务,然后我通过 visual studio 调试器将其部署到我的 Window
拥有 .net core 版本 3.1.8 和 asp.net core 版本 3.1.8 的 .net core worker 服务 我在从 worker 服务加载用户 secret 时遇到问题,但
我是一名优秀的程序员,十分优秀!