在树莓派中运行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
下载码是啥?如何下载=》点击查看