.NET 6 Linux 系统服务 Systemd (案例版)

.Net Core Windows 系统服务,之前已经写过了,但是,对于Linux的系统服务,却没有写过,主要是因为,大部分Linux的.Net服务都直接Docker了,当然,不排除有这种使用的,可能搞成启动执行了,也有可能用守护进程的方式搞,但是,Systemd这种系统服务的方式,还是十分推荐的。

那么就写一篇基于Linux Systemd 系统服务的案例

创建.Net 6 WorkServer

c6063aa44b6a0c1ae02a71c015651daa.png

我这里选了不使用.NET 6 特有的统一命名空间方式,就以旧方式编码。

d0885ee757f9f3c678143c359a632267.png

默认创建完,是这个样子的

b1ad5d24ecfdc9031a41bf7e18f51e54.png

添加Systemd 系统服务

Install-Package Microsoft.Extensions.Hosting.Systemd

然后,修改 Program方法为以下的方法,主要是增加了UseSystemd服务

public class Program
{public static void Main(string[] args){IHost host = Host.CreateDefaultBuilder(args).UseSystemd()//新增的 .UseSystemd()服务.ConfigureServices(services =>{services.AddHostedService<Worker>();}).Build();host.Run();}
}

修改WorkServer逻辑

public class Worker : BackgroundService
{private readonly ILogger<Worker> _logger;public Worker(ILogger<Worker> logger){_logger = logger;Log.Info($"后台服务初始化!");}protected override async Task ExecuteAsync(CancellationToken stoppingToken){_ = Task.Run(async () =>{while (!stoppingToken.IsCancellationRequested){Log.Info($"后台服务运行: {DateTime.Now}");await Task.Delay(1000, stoppingToken);}}, stoppingToken);await Task.CompletedTask;}public override Task StopAsync(CancellationToken cancellationToken){base.StopAsync(cancellationToken);Log.Info("系统服务停止!");return Task.CompletedTask;}
}

Linux 执行脚本

因为我感觉敲命令,老麻烦了(用惯了Windows),所以,还是简单点,提供了一些命令的脚本

WorkerServiceDemo.service

这个是Linux系统服务的标准名称,后缀是固定的.service

[Unit]
Description= WorkerServiceDemo[Service]
Type=notify
ExecStart=/usr/bin/dotnet  /home/kesshei/Desktop/WorkerServiceDemo/WorkerServiceDemo.dll[Install]
WantedBy=multi-user.target

initserver.sh

初始化服务,也叫安装服务,目的是把上面的 WorkerServiceDemo.service 服务文件拷贝到 /etc/systemd/system 系统服务路径下

系统服务下的服务还是挺多的

7cc22eeda0ab0194718ac88979ce6d77.png
#!/bin/bash
ServerPath='/etc/systemd/system'
FileName='WorkerServiceDemo.service'chmod +x start.sh
chmod +x stop.sh
chmod +x uninstallService.shcp $FileName $ServerPath/$FileName
echo 'copy success'
./start.sh
echo 'Server Init Success'

这个脚本,顺便把其他的sh授权了,所以, initserver.sh 文件要自己先给它授权,要不然,用不了 chmod +x initserver.sh 即可。

start.sh

启动服务

#!/bin/bash
sudo su - <<EOF
systemctl daemon-reload
systemctl start WorkerServiceDemo.service
systemctl enable WorkerServiceDemo.service
echo 'Server start Success'
EOF

stop.sh

停止服务

#!/bin/bash
sudo su - <<EOF
systemctl stop WorkerServiceDemo.service
systemctl disable WorkerServiceDemo.service
echo 'Server stop Success'
EOF

uninstallService.sh

卸载服务,基本与安装服务相反的方向

#!/bin/bash
sudo su - <<EOF
systemctl stop WorkerServiceDemo.service
systemctl disable WorkerServiceDemo.service
rm /etc/systemd/system/WorkerServiceDemo.service
systemctl daemon-reloadecho 'uninstallserver success'
EOF

项目部署到Linux下

我目前使用的linux是 Ubantu 18.4,但是,命令应该是类似的。

我直接复制Bin目录下的项目到Linux上

我到脚本目录下 /home/kesshei/Desktop/WorkerServiceDemo/Script

执行第一个命令

chmod +x initserver.sh

执行第二个命令

sudo ./initserver.sh

然后 输出,当然,也会让你输入root的密码

copy success
Created symlink /etc/systemd/system/multi-user.target.wants/WorkerServiceDemo.service → /etc/systemd/system/WorkerServiceDemo.service.
Server start Success
Server Init Success

没有啥异常,就说明,服务启动OK了。

同时,也要查看服务的日志目录是否有日志,来查看服务是否正常

下面这个路径:

/home/kesshei/Desktop/WorkerServiceDemo/Logs

我这边已经有了一个文件了

bb91104001afa7e8e04c6af4832621cf.png

也看到日志内容了。

停止服务

./stop.sh

输出以下内容

Removed /etc/systemd/system/multi-user.target.wants/WorkerServiceDemo.service.
Server stop Success

说明正常

同时也看到了,停止服务的消息,跟我们的业务逻辑是一致的。

44596f50a30bb5c92b39eeb3987750f7.png

启动服务

./start.sh

输出以下内容

Created symlink /etc/systemd/system/multi-user.target.wants/WorkerServiceDemo.service → /etc/systemd/system/WorkerServiceDemo.service.
Server start Success

说明正常

同时也看到了,启动服务的消息,跟我们的业务逻辑也是一致的。

c48201218f517b98e1df61ee80b6f5ac.png

重启系统后

可以看到,它自己是启动服务的。

498a0492d1443cef50b7684a87ea9117.png

总结

至此,Windows的系统服务和Linux的系统服务两种原生实现方式都实现了。

还是很不错的说。

代码地址

https://github.com/kesshei/WorkerServiceDemo.git

https://gitee.com/kesshei/WorkerServiceDemo.git

一键三连呦!,感谢大佬的支持,您的支持就是我的动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转]IaaS、PaaS、SaaS、CaaS、MaaS五者的区别

云计算构架图 很明显&#xff0c;这五者之间主要的区别在于第一个单词&#xff0c;而aaS都是as-a-service&#xff08;即服务&#xff09;的意思&#xff0c;这五个模式都是近年来兴起的&#xff0c;且这五者都是云计算的落地产品&#xff0c;所以我们先来了解一下云…

聊聊 C++ 中的四种类型转换符

一&#xff1a;背景 在玩 C 的时候&#xff0c;经常会用 void* 来指向一段内存地址开端&#xff0c;然后再将其强转成尺度更小的 char* 或 int* 来丈量一段内存&#xff0c;参考如下代码&#xff1a;int main() {void* ptr malloc(sizeof(int) * 10);int* int_ptr (int*)ptr;…

【QGIS入门实战精品教程】3.1:QGIS如何连接SQL Server数据库?

文章目录 软件必备测试SQL Server服务是否启动QGIS与SQL Server建立连接软件必备 SQL Server 2008 R2QGIS 3.22.3测试SQL Server服务是否启动 打开SQL Server配置管理器,查看MSSQLSERVER服务的启动情况。

开源重量级的流程引擎或UI引擎

关注这两个方面的同学个踊跃加粉了~~同时在下面回复期望开源哪一个&#xff0c;将先开源呼声高的一个。 好吧&#xff0c;先小秀一下UI&#xff1a; 增加下面的pom依赖&#xff0c;表示此工程需要org.tinygroup.aerowindow ?12345<dependency> <groupId>org.tinyg…

阿里云网盘内测开启 填写申请表获取邀请码 附最新申请地址

日前有相关报道显示&#xff0c;阿里方面推出了一款名为“阿里云网盘”的独立App&#xff0c;并且其是由阿里云团队开发&#xff0c;定位则是为C端用户提供可靠安全的存储备份及智能相册等功能。据了解&#xff0c;目前这款APP尚未正式上线&#xff0c;暂时还在邀请制测试阶段。…

跟我做⼀个⾼德地图的 iOS / Android MAUI控件(Android 原⽣库绑定)

我们已经介绍了如何通过 .NET 绑定 iOS 原⽣库 &#xff0c;本篇开始介绍⼀下如何通过 .NET 绑定 Android 原⽣库。Android的库Android 的库以 .jar 做打包&#xff0c; 通过⼯具你可以将多个 .jar 完成绑定&#xff0c;然后通过 C# 调⽤原⽣的 Java 库。对⽐起 iOS &#xff0…

【QGIS入门实战精品教程】4.6:QGIS实现栅格(影像、DEM)的拼接与掩膜提取

参考阅读:ArcGIS实验教程——实验十一:影像拼接与提取 加载实验数据 本实验所采用的栅格数据为两个dem数据和一个矢量范围数据,加载如下图所示: 栅格数据信息如下: 栅格拼接 点击下拉菜单【栅格】→【杂项】→【合并(merge)】,如下所示:

ReSharper 2020.2 补丁

ReSharper 是一个JetBrains公司出品的著名的代码生成工具。其能帮助Microsoft Visual Studio成为一个更佳的IDE&#xff0c;它包括一系列丰富的能大大增加C#和Visual Basic .net开发者生产力的特征。使用ReSharper&#xff0c;你可以进行深度代码分析&#xff0c;智能代码协助…

零中频接收机主要问题

直流偏差和本振泄漏问题基本不会影响超外差式接收机的性能&#xff0c;问题主要是镜频抑制。需要高Q值的带通滤波器。 零中频不存在镜频干扰&#xff0c;可以省掉镜像抑制滤波器和中频滤波器。零中频的主要问题是&#xff1a;1直流偏差 2本振泄漏 3 闪烁噪声。 1 本振泄漏 本振…

【QGIS入门实战精品教程】9.1:QGIS构建泰森多边形(Thiessen Polygon)实例精解

泰森多边形是进行快速插值和分析地理实体影响区域的常用工具。例如,用离散点的性质描述多边形区域的性质,用离散点的数据计算泰森多边形区域的数据。泰森多边形可用于定性分析、统计分析和临近分析等。 参考教程: ArcGIS构建泰森多边形(Thiessen Polygon)实例精解 【Glob…

“Visual Studio 启动不能打开上次打开的文件” 最正确的解决姿势

网上很多提供的方法&#xff0c;不是删除.vs目录&#xff0c;就是修改.suo文件。 删除有风险&#xff0c;操作需谨慎&#xff01;&#xff01; 其实最简单的方法就是&#xff1a;工具——选项——项目和解决方案——☑加载解决方案时重新打开文档(D)

【QGIS入门实战精品教程】5.1:QGIS地理坐标转火星坐标系(GCJ02)案例教程

本文以案例的形式,讲述WGS84(GPS)、火星坐标系(GCJ02)、百度地图(BD09)坐标系之间互相转换。 一、WGS转火星坐标系对比 文中将行政区的WGS坐标转为火星坐标系,局部效果对比: 二、火星坐标系简介 火星坐标系统是一种国家保密插件,也叫做加密插件或者加偏或者SM模组,其…

spark streaming 的 Job创建、调度、提交

2019独角兽企业重金招聘Python工程师标准>>> 上文已经从源码分析了Receiver接收的数据交由BlockManager管理&#xff0c;整个数据接收流都已经运转起来了&#xff0c;那么让我们回到分析JobScheduler的博客中。 // JobScheduler.scala line 62def start(): Unit sy…

官宣!微软发布 VS Code Server!

北京时间 2022 年 7 月 7 日&#xff0c;微软在 VS Code 官方博客中宣布了 Visual Studio Code Server&#xff01;远程开发的过去与未来2019 年&#xff0c;微软发布了 VS Code Remote&#xff0c;开启了远程开发的新时代&#xff01;2020 年&#xff0c;微软发布了 GitHub Co…

【QGIS入门实战精品教程】4.4:QGIS如何将点自动连成线、线生成多边形?

个人简介:刘一哥,多年研究地图学、地理信息系统、遥感、摄影测量和GPS等应用,精通ArcGIS等软件的应用,精通多门编程语言,擅长GIS二次开发和数据库系统开发,具有丰富的行业经验,致力于测绘、地信、数字城市、资源、环境、生态、国土空间规划、空间数字建模、无人机等领域…

.NET7之MiniAPI(特别篇) :Preview6 缓存和限流

前几在用MiniAPI时还想没有比较优雅的缓存&#xff0c;这不&#xff0c;Preivew6就带来了。使用起来很简单&#xff0c;注入Sevice&#xff0c;引用中间件&#xff0c;然后在Map方法的后面跟CacheOutput()就ok了&#xff0c;CacheOutpu也有不同的参数&#xff0c;可以根据每个方…

曾鸣:未来十年,将确定智能商业的格局|干货

2019独角兽企业重金招聘Python工程师标准>>> 20年来风云变幻&#xff0c;潮起潮涌&#xff0c;我自己最深的一个感受&#xff0c;是对“势”这个字的理解。 第一&#xff0c;敬畏。对于商业规律和对大势的把握&#xff0c;很容易在三五年内决定一个企业的命运。 第二…

Jedis 设置key的超时时间

一分钟之内只能发送一次短信, 若用户刷新页面,然后输入原来的手机号,则继续计时 方案:服务器端要记录时间戳 方法名:sMSWaitingTime 功能:返回倒计时剩余时间,单位秒 Java代码 /*** * 倒计时还剩余多长时间 * param mobile : 手机号 * return : second */…

【QGIS入门实战精品教程】4.1:QGIS栅格数据地理配准完整操作流程

推荐阅读:ArcGIS地理配准完整操作步骤 文章目录 一、安装地理配准插件二、准备实验数据三、配准操作流程1. 添加栅格数据2. 添加地面控制点3. 配准设置4. 开始配准5. 精度评价一、安装地理配准插件 点击下拉菜单【插件】→【管理并安装插件】,如下图所示: QGIS默认已经安装…

聊聊 C++ 中的几种智能指针 (上)

一&#xff1a;背景 我们知道 C 是手工管理内存的分配和释放&#xff0c;对应的操作符就是 new/delete 和 new[] / delete[], 这给了程序员极大的自由度也给了我们极高的门槛&#xff0c;弄不好就得内存泄露&#xff0c;比如下面的代码&#xff1a;void test() {int* i new i…