请看下面的详细讲解:
创建Linux守护进程
在Linux系统中,可以通过将程序作为守护进程的方式来运行,使得程序在后台持续运行,不会因为用户退出或系统重启而停止。下面是关于如何创建Linux守护进程的步骤:
步骤一:编写WebApi代码
首先,需要编写一个.NET Core3.0 WebApi项目,并编写需要持续运行的代码(比如后台定时任务等)。代码可以参考以下示例:
using System;
using System.Threading;
namespace WebApiTest
{
public class BackgroundTask
{
public void StartTask()
{
while (true)
{
Console.WriteLine("Background Task is running...");
Thread.Sleep(1000);
}
}
}
}
步骤二:安装NuGet包
安装Topshelf和Microsoft.Extensions.Hosting NuGet包,并在WebApi项目中引用。
步骤三:编写守护进程代码
在WebApi项目中编写一个类,用于创建和运行守护进程。代码可以参考以下示例:
using System;
using Microsoft.Extensions.Hosting;
using Topshelf;
namespace WebApiTest
{
public class DaemonService : ServiceControl, IHostedService
{
public IHostApplicationLifetime ApplicationLifetime { get; }
private readonly BackgroundTask _backgroundTask;
public DaemonService(BackgroundTask backgroundTask, IHostApplicationLifetime applicationLifetime)
{
_backgroundTask = backgroundTask;
ApplicationLifetime = applicationLifetime;
}
public bool Start(HostControl hostControl)
{
Console.WriteLine("Starting Daemon Service...");
_backgroundTask.StartTask();
Console.WriteLine("Daemon Service Started.");
return true;
}
public bool Stop(HostControl hostControl)
{
Console.WriteLine("Stopping Daemon Service...");
ApplicationLifetime.StopApplication();
Console.WriteLine("Daemon Service Stopped.");
return true;
}
public virtual async Task StartAsync(CancellationToken cancellationToken)
{
await Task.Factory.StartNew(() => Start(null), cancellationToken);
}
public virtual async Task StopAsync(CancellationToken cancellationToken)
{
await Task.Factory.StartNew(() => Stop(null), cancellationToken);
}
}
}
步骤四:在Program.cs中配置守护进程
在WebApi项目的Program.cs文件中,将守护进程配置为使用Topshelf来创建和运行。代码可以参考以下示例:
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Topshelf;
namespace WebApiTest
{
public class Program
{
public static void Main(string[] args)
{
var isService = !(Debugger.IsAttached || args.Contains("--console"));
var builder = CreateHostBuilder(args.Where(arg => arg != "--console").ToArray());
var host = builder.Build();
if (isService)
{
var exitCode = HostFactory.Run(x =>
{
x.Service<DaemonService>(s =>
{
s.ConstructUsing(srv => ActivatorUtilities.CreateInstance<DaemonService>(host.Services));
s.WhenStarted((srv, hostControl) => srv.Start(hostControl));
s.WhenStopped((srv, hostControl) => srv.Stop(hostControl));
});
x.RunAsLocalSystem();
x.SetDescription("WebApi Daemon Service");
x.SetDisplayName("WebApi Daemon");
x.SetServiceName("WebApiDaemon");
});
int exitCodeValue = (int)Convert.ChangeType(exitCode, exitCode.GetTypeCode());
Environment.ExitCode = exitCodeValue;
}
else
{
host.Run();
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureServices((hostContext, services) =>
{
services.AddSingleton<BackgroundTask>();
services.AddHostedService<DaemonService>();
})
.UseSerilog();
}
}
以上代码将WebApi项目构建为了一个守护进程,并通过Topshelf包来管理守护进程的启动和停止。
示例说明
在以上步骤完成后,可以通过以下两个示例来验证守护进程的创建和运行效果:
示例一:运行守护进程
-
在Linux系统中,使用命令行进入到WebApi项目的根目录。
-
使用以下命令来运行守护进程:
sudo dotnet {WebApi项目名称}.dll
- 观察程序的输出,可以看到守护进程已经开始持续运行。按Ctrl+C可以停止程序。
示例二:使用systemd将WebApi设为守护进程
-
在Linux系统中,使用命令行进入到WebApi项目的根目录。
-
创建并编辑一个WebApi.service文件:
sudo nano /etc/systemd/system/WebApi.service
- 将以下文本复制到WebApi.service文件中:
[Unit]
Description=WebApi Daemon Service
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/{WebApi项目目录}
ExecStart=/usr/bin/dotnet {WebApi项目名称}.dll
Restart=always
[Install]
WantedBy=multi-user.target
- 保存WebApi.service文件,并运行以下命令来启用和运行守护进程:
sudo systemctl daemon-reload
sudo systemctl enable WebApi
sudo systemctl start WebApi
- 守护进程已经开始运行,可以使用以下命令来查看运行状态:
sudo systemctl status WebApi
以上两条示例展示了如何在Linux系统中创建并运行.NET Core 3.0 WebApi守护进程的方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.net Core 3.0 WebApi 创建Linux守护进程的方法 - Python技术站