.Net 8 控制台程序部署(Linux篇)

在无流量Linux环境下部署.NET8开发的控制台程序

写在前面

好久没更新文章了,今天给大家带来的是在在无流量的Linux工控机上部署.Net8开发的控制台程序,并将其作为一个后台服务持续运行。废话不多说,直接进入正题。

准备

今天的教学还是需要一点成本的,首先你得拥有一台Linux工控机,我用的是Debian,你也可以用其他的,如果遇到了文章内容之外的问题,欢迎讨论。其次你要完成一个在.net8环境下开发的控制台程序,这对各位来说应该是比较简单。

远程访问

既然我们要在linux系统上部署我们的程序,那第一步肯定是远程访问linux系统,这里我使用的是xshell7和xftp7(虽然一直提示我升级)。

这里关于怎么远程访问到linux系统我就不赘述了,比如配置IP,确定root账号密码等相关的资料网上应该是很多的。

安装环境

我这边安装的是.Net8 sdk,两个原因:1是我确实会有在linux系统上直接编译代码的需求,所以如果只安装CLR是不能满足我的使用需求的。2是我CLR安装一直出问题😂,没办法直接安装sdk了。

环境安装步骤如下

程序部署

1.下载并导入

在微软官网查看自己的linux版本是否被支持,然后根据你的操作系统下载对应的sdk二进制文件,这里我下载的是Arm32的二进制文件。

然后使用xshell配套的工具xftp来将这个文件移动到linux工控机上合适的位置,建议是/usr/share/dotnet(如果不存在就自己创建一个)。

2.解压并配置

首先解压到指定位置

sudo tar -C /usr/share/dotnet -xzf dotnet-sdk-8.0.303-linux-arm.tar.gz

注意,这里可以直接执行这条命令的条件是,你当前的位置在该二进制文件的目录

然后创建软连接

sudo ln -s /usr/share/dotnet/dotnet /usr/bin/

创建软连接类似于配置环境变量。

最后验证安装的sdk版本

dotnet --version

3.发布程序

右键项目,右键菜单中有一个发布菜单,点击发布他会出现一个发布导航界面,只要按照他的引导将项目发布到publish文件夹中就可以了,然后使用xftp工具将这个publish文件移动到工控机上合适的位置。我暂时将这个文件移动到/usr/share/program/

4.创建Systemd服务单元文件

创建一个名为myconsoleapp.service的文件在/etc/systemd/system目录下,具体指令如下

sudo nano /etc/systemd/system/myconsoleapp.service

该指令会创建该文件并进入编辑窗口。输入

Unit

Description=My Console Application Service

After=network.target

Service

User=root

WorkingDirectory=/usr/share/program/publish

ExecStart=/usr/share/dotnet/dotnet /usr/share/program/publish/LocalEMS.Cmd.dll

Restart=no

RestartSec=10

KillSignal=SIGINT

TimeoutStopSec=5

Environment=ASPNETCORE_ENVIRONMENT=Production

Environment=DOTNET_PRINT_TELEMETRY_INFO=false

Install

WantedBy=multi-user.target

上述配置具体解释如下

Unit

这部分包含了描述服务的元数据。

Description: 服务的描述,这里是"My Console Application Service"。

After: 表示这个服务启动前需要等待的其他服务或目标。这里的network.target意味着你的应用程序会在网络完全启动后才启动,确保应用程序可以访问网络资源。

Service

这部分包含了服务的实际配置细节。

User: 指定运行服务的用户。

WorkingDirectory: 服务运行的工作目录。即应用程序的根目录。

ExecStart: 启动服务时要执行的命令。这里是要运行的控制台应用程序的路径。

Restart: 服务失败后重启的策略。

RestartSec: 重启间隔时间,单位是秒。这里设定为10秒,即如果服务失败,将在10秒后尝试重启。

KillSignal: 发送给服务的终止信号。SIGINT是一个中断信号,通常用于礼貌地请求服务停止。

TimeoutStopSec: 等待服务响应停止命令的时间,超过此时间后,系统会强行杀死服务。这里设定为5秒。

Environment: 设置服务运行时的环境变量。这里设定了ASPNETCORE_ENVIRONMENT为Production,意味着应用程序将在生产模式下运行;DOTNET_PRINT_TELEMETRY_INFO设为false,禁用了.NET框架的遥测信息打印。

Install

这部分包含了服务安装到 Systemd 的配置。

WantedBy: 服务属于哪个启动目标。multi-user.target意味着这个服务将在多用户模式下启动,这是大多数服务的标准目标。

5.启用并启动服务

首先重新加载配置

sudo systemctl daemon-reload

然后启用该服务

sudo systemctl enable myconsoleapp.service

sudo systemctl start myconsoleapp.service

最后查看该服务的状态

sudo systemctl status myconsoleapp.service

写在结尾

没啥好说的,天道酬勤,与君共勉。

相关推荐
爱学习的小囧1 小时前
ESXi 8.0 原生支持 NVMe 固态硬盘吗?VMD 配置详解教程
linux·运维·服务器·esxi·esxi8.0
坚持就完事了1 小时前
Linux中的变量
linux·运维·服务器
handler011 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
Cat_Rocky2 小时前
利用Packet Tracer网络实验
linux·运维·服务器
嵌入式×边缘AI:打怪升级日志2 小时前
Linux 驱动实战:SR501 人体红外传感器驱动开发与调试全记录
linux·运维·驱动开发
正点原子2 小时前
【正点原子Linux连载】第三章 U-Boot使用 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南
linux·运维·驱动开发
Qbw20042 小时前
【Linux】进程地址空间
linux·c++
爱学习的小囧3 小时前
ESXi VMkernel 端口 MTU 最佳设置详解
运维·服务器·网络·php·虚拟化
jamon_tan4 小时前
linux下lvgl8.3动态库编译
linux
程序员老邢4 小时前
【技术底稿 19】Redis7 集群密码配置 + 权限锁死 + 磁盘占满连锁故障真实排查全记录
java·服务器·经验分享·redis·程序人生·微服务