在树莓派中运行net6服务程序
作者:三味书屋 来源: 2022/12/20 10:24:46

    在树莓派中运行net6服务程序

    在树莓派中安装net6运行环境并运行.net6应用程序

    记录生成同时支持windows和linux的服务

    net6独立部署到centos8(无需安装net6环境)

  .net6新增windows服务 

  .netCore2.1创建服务程序

    centos8中配置python服务程序

    ASP.NetCoreWeb以服务形式运行

    在上文中已经成功在树莓派中安装net6运行环境并运行.net6应用程序,https://www.luweidong.cn/details/80。可是此程序只能在控制台调用,一旦关闭了控制台,该程序也就停止了。

    那有没有可能把这个程序做成后台服务呢,当树莓派启动后,自动运行该程序。

    创建.net6控制台应用程序:

    

1、NuGet中安装依赖项

1)Microsoft.Extensions.Hosting.Systemd

2)Microsoft.Extensions.Hosting


安装成功:


2、新增Worker.cs

namespace test
{
    public class Worker : BackgroundService
    {
        private readonly ILogger<Worker> _logger;

        public Worker(ILogger<Worker> logger)
        {
            _logger = logger;
        }

        //重写BackgroundService.StartAsync方法,在开始服务的时候,执行一些处理逻辑,这里我们仅输出一条日志
        public override async Task StartAsync(CancellationToken cancellationToken)
        {
            _logger.LogInformation("Worker starting at: {time}", DateTimeOffset.Now);

            await base.StartAsync(cancellationToken);
        }

        //重写BackgroundService.ExecuteAsync方法,封装windows服务或linux守护程序中的处理逻辑
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            //如果服务被停止,那么下面的IsCancellationRequested会返回true,我们就应该结束循环
            while (!stoppingToken.IsCancellationRequested)
            {
                //模拟服务中的处理逻辑,这里我们仅输出一条日志,并且等待1秒钟时间
                _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
                await Task.Delay(1000, stoppingToken);
            }
        }

        //重写BackgroundService.StopAsync方法,在结束服务的时候,执行一些处理逻辑,这里我们仅输出一条日志
        public override async Task StopAsync(CancellationToken cancellationToken)
        {
            _logger.LogInformation("Worker stopping at: {time}", DateTimeOffset.Now);

            await base.StopAsync(cancellationToken);
        }
    }
}

3、修改主函数


using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace test
{
    public class Program
    {
        async static Task Main(string[] args)
        {
            //CreateHostBuilder(args).Build().Run();
            IHost host = Host.CreateDefaultBuilder(args)
                .UseSystemd()
                .ConfigureServices(services =>
                {
                    services.AddHostedService<Worker>();
                })
                .Build();
            await host.RunAsync();
        }

        //public static IHostBuilder CreateHostBuilder(string[] args) =>
        //    Host.CreateDefaultBuilder(args)
        //        .ConfigureServices((hostContext, services) =>
        //        {
        //            services.AddHostedService<Worker>();
        //        });
    }
}

Ctrl+F5运行测试下:

4、发布程序


目标框架:net6.0

部署模式:依赖框架

目标运行时:可移植的


5、上传程序至树莓派


#修改权限
sudo chmod 777 test.dll


6、创建Linux服务

#1、进入/etc/systemd/system
cd /etc/systemd/system
#2、创建test.service文件
sudo nano test.service
#3、输入内容
[Unit]
Description=test service
After=network.target #表示当前服务是在那个服务后面启动,一般定义为网络服务启动后启动
 
[Service]
Type=notify#从UseSystemd()的注释中看到,启动类型必须是notify
ExecStart=/home/pi/dotnet/dotnet /home/pi/test/test.dll

[Install]
WantedBy=multi-user.target#表示多用户命令行状态


接着Ctrl+o,再Enter进行保存,Ctrl+X退出编辑画面。

#Type字段:定义启动类型。它可以设置的值如下:
#         - simple(默认值):ExecStart字段启动的进程为主进程
#         - forking:后台执行,ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程
#         - oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务
#         - dbus:类似于simple,但会等待 D-Bus 信号后启动
#         - notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务
#         - idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混

#4、重新挂载服务
sudo systemctl daemon-reload
#5启动服务
sudo systemctl start test.service
#6、设置开机启动
sudo systemctl enable test.service
#7、查看服务信息
sudo systemctl status test.service


操作命令总结:

//重新挂载服务
sudo systemctl daemon-reload

//启动服务
sudo systemctl start test.service
//停止
sudo systemctl stop test.service
//设置开机启动
sudo systemctl enable test.service

//查看服务信息
sudo systemctl status test.service
//查看服务是否是自启动
systemctl is-enabled test.service

    我已将代码上传,下载码是:6212330F1C

    下载码是啥?如何下载=》点击查看

称      呼:
联系方式:
您的评论:
技术支持:l.w.dong@qq.com www.luweidong.cn
广州市   wx:lwdred
Copyright © 2014 三味书屋 All Rights Reserved
技术支持:l.w.dong@qq.com  sitemap xml  sitemap html

粤公网安备44010602011869号

粤ICP备13031080号-1