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服务相关推荐
- WTM(ASP.NET 5 or 6)发布为Windows服务和使用bat方式启动
最近部署wtm研发的考试系统,系统在线下机房部署.运气不好的是对方给提供WindowsServer2016操作系统居然是盗版系统,IIS无法正常部署wtm应用. 为了解决这一问题,初期想到的方案就是使 ...
- java windows wrapper_Java Service Wrapper 发布Java程序为Windows服务
现在目前只要32位有免费的,64位免费版目前还没有做出来.官网上(社区)那一列是免费的. 1.先把你的项目用MANIFEST.MF打成jar包,例如bb.jar.新建目录,例如:dist,放在D盘下面 ...
- 第三节:Windows平台部署Asp.Net Core应用(基于IIS和Windows服务两种模式)
一. 简介 Asp.Net Core 部署方式有两种:依赖框架和独立部署. 1. 框架依赖的部署: 顾名思义,依赖框架的部署 (FDD) 依赖目标系统上存在共享系统级版本的 .NET Core. 由于 ...
- 使用C#调试Windows服务模板项目
目录 介绍 特征 准备此应用程序的步骤如下 1.创建Windows服务项目 2.将项目输出类型从Windows应用程序更改为控制台应用程序 3.安装log4net包 4.配置log4net 5.添加S ...
- 如何基于 dotnetcore worker service 创建 windows 服务
.NET CORE 3.1 提供了 worker service 这么一个模板,可以方便开发者来创建"windows 服务程序"(同样可发布于 linux). 本篇以 centos ...
- netcore一键部署到linux服务器以服务方式后台运行
AntDeploy 是我开发一款开源一键发布插件 将本地vs中的代码,一键打包,部署到任意的远程服务器 部署方式支持 windows服务,linux服务,docker容器,iis 支持增量发布(只更新 ...
- 一键将kafka,zookeeper安装为windows服务
正式的网站项目,使用了kafka和 zookeeper,原来是通过命令行启动的,存在的风险就是其他人上服务器可能随时或者不小心给你把命令行cmd给关闭掉,这样kafka和zookeeper就挂掉了,那 ...
- nssm和AlwaysUp来包装exe文件为windows服务
最近遇到要把windows exe文件部署为service,因为原先开发为exe程序,现在有不想修改code改为service,但是部署必须是service服务, 所以我们需要一个包装器来包装exe为 ...
- 使用C#创建Windows服务 并发布Windows 服务
一.开发环境 操作系统:Windows 10 X64 开发环境:VS2015 编程语言:C# .NET版本:.NET Framework 4.0 目标平台:X86 二.创建Windows Servic ...
最新文章
- python第三方库之学习pyserial库--串口通信
- 比特币现金锚定货币交易所越来越多
- 使用SQL SERVER 2000的全文检索功能
- Android 内存优化测试(转)
- 视频服务器读取hdfs文件,基于HDFS的流媒体服务器Red5视频文件分发的研究与应用...
- Java项目:前台展示+后台管理结合的在线购书系统(java+Springboot+ssm+mysql+maven)
- LumaQQ.NET For Visual Studio 2005 代码下载
- GCT 英语单词分组记忆手册
- C语言基础学习——基本数据类型(char型)
- JUC并发编程学习笔记
- 计算机编程在哪里学,高中毕业想学计算机编程,不知道从哪开始学起。
- Web在线打印设计器即将推出,像Excel一样在线设计模板
- 数据库学习笔记2(补遗笔记1)
- 螺栓校核matlab仿真
- Apache虚拟主机配置详解
- 计算机毕业设计php的宠物狗销售网站
- 软件无线电技术简介及特点应用
- WRF中使用ERA5再分析数据
- 程序员 计算机网络,程序员必备计算机网络知识
- 熊掌记导出html没有换行,Bear|熊掌记:标签使用指南