netcore一键nssm发布为windows服务
AntDeploy
是我开发一款开源一键部署工具包
发布功能支持:
- docker容器一键部署
- docker镜像一键发布
- 支持iis一键部署
- windows服务一键部署
- linux服务一键部署
- 支持增量发布
- 支持一键回滚
- 支持点火
- 支持选择特定文件发布
- 支持查看发布记录
一个issue
前两天有一个使用者给我反馈了一个issue

他是用asp5.0开发了一个web程序,然后用AntDeploy来部署,
由于AntDeploy部署时读取服务的安装路径,然后进行更新。
但是针对nssm部署的服务有一个特点,执行路径是nssm.exe,如下图:

那么AntDeploy在更新部署的时候会更新到nssm.exe所在的目录了。
解决思路
nssm是一个开源c语言写的软件,大概只有300kb,可以很方便的把程序安装成一个windows服务。
nssm就像是一个服务管理器,windows服务启动的时候 会调用nssm.exe传入serviceName、然后nssm.exe会根据serviceName拿到配置的实际要运行的文件。
查了下nssm官网
可以根据命令
nssm get <serviceName> Application
获取实际要执行的程序地址
那么要想要兼容第一次是由nssm.exe部署,后面用AntDeploy发布的场景,则需要
- 根据调用nssm的命令拿到真实路径
- 根据真实路径进行部署

既然是开源软件,就让这位仁兄来帮我写这部分代码吧

果然这位仁兄战斗力可以,很快就搞定了


开源就是要参与进来 这也是我热爱开源的原因
扩展nssm发布windows功能
上面虽然已经解决了:首次用nssm发布,后面用AntDeploy来更新的场景。
还需要解决掉首次无法使用nssm发布的功能。
我觉得有必要加这个功能,来完成nssm发布windows服务的闭环
好处有:
一般按照微软开发winfows服务的标准的话 是需要引入包:Microsoft.Extensions.Hosting.WindowsServices
但是用nssm可以不需要引入。
所以在netcore开发web的场景使用nssm安装为windows服务很方便
而且使用nssm安装的另外一个优点是可以指定启动参数? 比如 --urls=http://*:10007
开始开发
1. 客户端 增加入口可以使用nssm

2. ageng端增加 nssm
在windows场景下才 作为内嵌资源。针对linux场景不需要。

在启动的时候释放出来:
var nssmSavePath = Path.Combine(Startup.RootPath, "nssm.exe");
if (File.Exists(nssmSavePath))
{
return;
}
Assembly assembly = typeof(AntDeployAgentWindowsService).Assembly;
using (Stream stream = assembly.GetManifestResourceStream("AntDeployAgentService.nssm.exe"))
{
if (stream != null)
{
using (var fileStream = File.Create(nssmSavePath))
{
stream.Seek(0, SeekOrigin.Begin);
stream.CopyTo(fileStream);
}
}
}
if (!File.Exists(nssmSavePath))
{
throw new FileNotFoundException(nssmSavePath + " not found");
}
和客户端约定了2个新传参:
- useNssm 客户端是否选择采用nssm来部署服务
- param 服务运行的参数
agent端处理第一次用nssm部署
主要用到了下面几个命令:
nssm install <serviceName> "<实际执行文件的完整路径>"
nssm set <serviceName> AppDirectory "<实际执行文件所在的目录>"
nssm set <serviceName> Description "<服务的描述>"
nssm set <serviceName> AppParameters "<服务运行指定的参数>"
nssm start <serviceName>
封装一个方法来执行nssm命令
public static bool RunExternalExe(string projectPath, string arguments, Action<string> logger)
{
Process process = null;
try
{
if (string.IsNullOrEmpty(arguments))
{
throw new ArgumentException(nameof(arguments));
}
process = new Process();
process.StartInfo.FileName = projectPath;
process.StartInfo.Arguments = arguments;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.StartInfo.UseShellExecute = false;
process.StartInfo.Verb = "runas";
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
process.OutputDataReceived += (sender, args) =>
{
if (!string.IsNullOrWhiteSpace(args.Data))
{
logger(args.Data);
}
};
process.BeginOutputReadLine();
process.ErrorDataReceived += (sender, data) =>
{
if (!string.IsNullOrWhiteSpace(data.Data)) logger(data.Data);
};
process.BeginErrorReadLine();
process.WaitForExit();
//var err = process.StandardError.ReadToEnd();
return process.ExitCode == 0;
}
catch (Exception ex)
{
return false;
}
finally
{
process?.Dispose();
}
}
以aspnet5的web测试
完整的运行效果是:

服务部署成功

访问成功

成功物
插件最新版: v7.32
agent最新版:v6.9
源码地址:https://github.com/yuzd/AntDeployAgent
交流QQ群:488312978
netcore一键nssm发布为windows服务的更多相关文章
- Asp.NetCore 3.1demo发布使用Windows服务
Core之Windows服务 使用测试之前,先来简单了解一下 window自带的sc命令 ========install.bat set serviceName=你的服务名称 set serviceF ...
- 用JavaServiceWrapper将JAVA程序发布成Windows服务
怎么把jar文件做成系统服务,比较多的解决方案是使用 wrapper-windows 这个软件包.这个软件包的强大之处是能把jre环境也给打进去,这个服务可以正常运行在根本没有jre环境即就没有安装J ...
- windows下zookeeper安装并发布成windows服务
https://blog.csdn.net/yzy199391/article/details/80605195
- AntDeploy一键发布netcore3.0Windows服务到远程服务器
*:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...
- 使用C#调试Windows服务模板项目
Windows服务是非常强大的应用程序,可用于在backgorund中执行许多不同类型的任务.他们可以在不需要任何用户登录的情况下启动,并且可以使用除登录用户之外的其他用户帐户运行.但是,如果通过遵循 ...
- netcore项目在Windows部署:使用NSSM部署Windows服务
NSSM部署Windows服务 1 准备工作 在Windows平台部署Asp.net core应用程序一般采用IIS,但是如果我们的net core应用执行的是定时任务,需要开机自启,稳定运行的话,使 ...
- dotnet-warp && NSSM 部署 .net core 项目到 windows 服务
如果你想将 .net core 项目以服务的形式部署到 windows 系统,希望本篇文章能够让你少走弯路 dotnet-warp 安装使用 dotnet-warp 是一个全局的.NET Core 工 ...
- 使用NSSM把.Net Core部署至 Windows 服务
为什么部署至Windows Services 在很多情况下,很少会把.Net Core项目部署至Windows服务中,特别是Asp.net Core就更少了.一般情况下,Asp.net Core会部署 ...
- NSSM把.Net Core部署至 Windows 服务
NSSM把.Net Core部署至 Windows 服务 https://www.cnblogs.com/emrys5/p/nssm-netcore.html 为什么部署至Windows Servic ...
随机推荐
- UF_LAYER 图层操作
Open C uc5007uc5008uc5009UF_LAYER_ask_category_infoUF_LAYER_ask_category_tagUF_LAYER_ask_statusUF_LA ...
- OOP第三次总结Blog
1. 前言 相比于前一次Blog题目集,此次七八九题目集偏重于类的继承.多态性使用方法以及接口的应用;在设计层面,强调模式复用,不断的迭代,若前期设计不合理,则后续的题目增加新的功能(即可扩展性)将会 ...
- 【曹工杂谈】Mysql客户端上,时间为啥和本地差了整整13个小时,就离谱
瞎扯一点非技术 本来今天上午就打算写的,结果中途被别的事吸引了注意力,公司和某保险公司合作推了一个医疗保险,让我们给父母买,然后我研究了半天条款:又想起来之前买的支付宝那个好医保,也买了两年多了,但是 ...
- Linux面试题(史上最全、持续更新、吐血推荐)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- 天天写order by,你知道Mysql底层如何执行吗?
在实际的开发中一定会碰到根据某个字段进行排序后来显示结果的需求,但是你真的理解order by在 Mysql 底层是如何执行的吗? 假设你要查询城市是苏州的所有人名字,并且按照姓名进行排序返回前 10 ...
- CMD批处理(4)——批处理循环语句结构
FOR函数,对一组文件批量执行命令,基本模式如下 1.文件搜索 for [/D] [/R [路径]] %%变量 in (集合) do (命令) 2.等差数列 for /L %%变量 in (开始,间隔 ...
- linux文件系统和日志分析
一.Linux文件系统 1.inode与block 1.概述: (1)文件数据包括元信息与实际信息 (2)文件存储在硬盘上,硬盘最小存储单位是"扇区",每个扇区存储512字节 (3 ...
- 服务器硬件和RAID配置
服务器 硬件和RAID配置 目录 一.RAID 磁盘阵列介绍 1.1.RAID 0(条带化存储) 1.2.RAID 1(镜像存储) 1.3.RAID 5 1.4.RAID 6 1.5.RAID 1+0 ...
- kustomize简单使用
1.背景 在Kubernetes v1.14版本的发布说明中,kustomize 成为了 kubectl 内置的子命令,并说明了 kustomize 使用 Kubernetes 原生概念帮助用户创作并 ...
- .obj : error LNK2019: 无法解析的外部符号
记录一个报错 .obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall 习惯上先去看看 | "#include"语 ...