.net Core 3.0 WebApi 创建Linux守护进程的方法

请看下面的详细讲解:

创建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包来管理守护进程的启动和停止。

示例说明

在以上步骤完成后,可以通过以下两个示例来验证守护进程的创建和运行效果:

示例一:运行守护进程

  1. 在Linux系统中,使用命令行进入到WebApi项目的根目录。

  2. 使用以下命令来运行守护进程:

sudo dotnet {WebApi项目名称}.dll
  1. 观察程序的输出,可以看到守护进程已经开始持续运行。按Ctrl+C可以停止程序。

示例二:使用systemd将WebApi设为守护进程

  1. 在Linux系统中,使用命令行进入到WebApi项目的根目录。

  2. 创建并编辑一个WebApi.service文件:

sudo nano /etc/systemd/system/WebApi.service
  1. 将以下文本复制到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
  1. 保存WebApi.service文件,并运行以下命令来启用和运行守护进程:
sudo systemctl daemon-reload
sudo systemctl enable WebApi
sudo systemctl start WebApi
  1. 守护进程已经开始运行,可以使用以下命令来查看运行状态:
sudo systemctl status WebApi

以上两条示例展示了如何在Linux系统中创建并运行.NET Core 3.0 WebApi守护进程的方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.net Core 3.0 WebApi 创建Linux守护进程的方法 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 看云上 ClickHouse 如何做计算存储分离

    2020年12月6日-7日,由InfoQ 中国主办的综合性技术盛会QCon全球软件开发大会深圳站召开。QCon 内容源于实践并面向社区,演讲嘉宾依据热点话题,面向资深的技术团队负责人、架构师、工程总监、开发人员分享技术创新和实践。 在 QCon 盛会上,腾讯云大数据专家工程师陈龙为大家带来了题为《看云上 ClickHouse 如何做计算存储分离》的分享,以下…

    云计算 2023年4月11日
    00
  • python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】

    下面我就来为你详细讲解“Python栈的基本定义与使用方法示例”的完整攻略。 栈的基本定义 栈是一种先进后出的数据结构,类似于堆叠一摞书的过程。我们可以把栈想象成一个装有元素的容器,只能从顶端进出。栈的两个基本操作是入栈(push)和出栈(pop)。入栈将元素放到栈顶,而出栈则是弹出栈顶元素。 在Python中,我们可以使用列表(list)来模拟一个栈。通过…

    云计算 2023年5月18日
    00
  • 云计算虚拟化理论

    虚拟化三元素: 对于网卡来讲,在一个虚拟化的环境中,一个或者多个VM都是跑在一台物理机的,这些VM也有独立的操作系统,而这些操作系统是通过一个hypervisor跑在物理机的操作系统上。同时,这个物理机要提供相应的资源给VM,比如它会提供一个虚拟的网卡给VM,VM会把它当作一个真实的物理网卡。这里面就涉及了三个部分: KVM kernel based的VM可…

    云计算 2023年4月12日
    00
  • 区块链CHAT是什么币?CHAT币官网总量和上架交易所介绍

    区块链CHAT是什么币? 区块链CHAT是一种基于区块链技术的数字货币,它的全称是ChatCoin。CHAT币的官网是https://www.openchat.co/,总量为21亿枚。CHAT币已经上架了多个交易所,包括Binance、Huobi、Gate.io等。 CHAT币的特点 CHAT币的特点如下: 基于区块链技术,具有去中心化、安全、透明等特点。 …

    云计算 2023年5月16日
    00
  • 当Serverless遇到Regionless:现状与挑战

    摘要:本文尝试基于分析现有的学术文章,剖析Serverless与Regionless并存时,在性能提升和成本控制两个方向的现状与挑战 本文分享自华为云社区《当Serverless遇到Regionless:现状与挑战》,作者:云容器大未来。 近年来,Serverless服务崛起的趋势是有目共睹的:从Berkeley将Serverless认定为云计算向用户呈现的…

    云计算 2023年5月8日
    00
  • Python中urllib+urllib2+cookielib模块编写爬虫实战

    一、Python中urllib+urllib2+cookielib模块编写爬虫实战攻略 最常用的Python爬虫模块之一就是urllib库和urllib2库,它们可以用于进行HTTP(S)请求,获取网页源代码等操作。同时我们还可以使用Python中的cookielib模块来管理Cookies,模拟登录,配合urllib+urllib2使用可以实现爬虫的功能。…

    云计算 2023年5月18日
    00
  • C# WebApi+Webrtc局域网音视频通话实例

    下面是详细讲解“C# WebApi+Webrtc局域网音视频通话实例”的完整攻略。 简介 本攻略将介绍如何利用C# WebApi和WebRTC技术实现局域网内的音视频通话功能。本攻略将分为以下几个部分: WebRTC技术简介 准备工作 WebApi搭建 WebRTC实现 WebRTC技术简介 WebRTC是一种基于Web的实时通信技术,它可以在浏览器之间直接…

    云计算 2023年5月17日
    00
  • ASP.NET开源导入导出库Magicodes.IE完成Csv导入导出的方法

    一、引言 ASP.NET是一种基于Web的应用程序框架,旨在开发动态网站。而Magicodes.IE则是一种用于操作Excel、Csv和Html的开源库,使用简单方便,实现了导入、导出、数据验证等功能。本文将对使用Magicodes.IE完成Csv导入导出的完整攻略进行详细讲解。 二、安装 在软件安装时,通过NuGet安装Magicodes.IE库并引用到项…

    云计算 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部