日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

netcore一键nssm发布为windows服务

發(fā)布時間:2023/12/4 windows 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 netcore一键nssm发布为windows服务 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

AntDeploy

是我開發(fā)一款開源一鍵部署工具包

功能一覽:

  • docker容器一鍵部署

  • docker鏡像一鍵發(fā)布

  • 支持iis一鍵部署

  • windows服務(wù)一鍵部署

  • linux服務(wù)一鍵部署

  • 支持增量發(fā)布

  • 支持一鍵回滾

  • 支持點火

  • 支持選擇特定文件發(fā)布

  • 支持查看發(fā)布記錄

一個issue

前兩天有一個使用者給我反饋了一個issue

image

他是用asp5.0開發(fā)了一個web程序,然后用AntDeploy來部署, 由于AntDeploy部署時讀取服務(wù)的安裝路徑,然后進行更新。但是針對nssm部署的服務(wù)有一個特點,執(zhí)行路徑是nssm.exe,如下圖:

image

那么AntDeploy在更新部署的時候會更新到nssm.exe所在的目錄了。

解決思路

nssm是一個開源c語言寫的軟件,大概只有300kb,可以很方便的把程序安裝成一個windows服務(wù)。

nssm就像是一個服務(wù)管理器,windows服務(wù)啟動的時候 會調(diào)用nssm.exe傳入serviceName、然后nssm.exe會根據(jù)serviceName拿到配置的實際要運行的文件。

查了下nssm官網(wǎng)

可以根據(jù)命令

nssm?get?<serviceName>?Application

獲取實際要執(zhí)行的程序地址

那么要想要兼容第一次是由nssm.exe部署,后面用AntDeploy發(fā)布的場景,則需要

  • 根據(jù)調(diào)用nssm的命令拿到真實路徑

  • 根據(jù)真實路徑進行部署

image

既然是開源軟件,就讓這位仁兄來幫我寫這部分代碼吧

image

果然這位仁兄戰(zhàn)斗力可以,很快就搞定了

imageimage
開源就是要參與進來 這也是我熱愛開源的原因

擴展nssm發(fā)布windows功能

上面雖然已經(jīng)解決了:首次用nssm發(fā)布,后面用AntDeploy來更新的場景。

還需要解決掉首次無法使用nssm發(fā)布的功能。

我覺得有必要加這個功能,來完成nssm發(fā)布windows服務(wù)的閉環(huán)

好處有:

一般按照微軟開發(fā)winfows服務(wù)的標準的話?是需要引入包:Microsoft.Extensions.Hosting.WindowsServices但是用nssm可以不需要引入。所以在netcore開發(fā)web的場景使用nssm安裝為windows服務(wù)很方便而且使用nssm安裝的另外一個優(yōu)點是可以指定啟動參數(shù)??比如?--urls=http://*:10007

開始開發(fā)

1. 客戶端 增加入口可以使用nssm
image

2. ageng端增加 nssm

在windows場景下才 作為內(nèi)嵌資源。針對linux場景不需要。

image

在啟動的時候釋放出來:

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來部署服務(wù)

  • param 服務(wù)運行的參數(shù)

agent端處理第一次用nssm部署

主要用到了下面幾個命令:

nssm?install?<serviceName>?"<實際執(zhí)行文件的完整路徑>"nssm?set?<serviceName>?AppDirectory?"<實際執(zhí)行文件所在的目錄>"nssm?set?<serviceName>?Description?"<服務(wù)的描述>"nssm?set?<serviceName>?AppParameters?"<服務(wù)運行指定的參數(shù)>"nssm?start?<serviceName>

封裝一個方法來執(zhí)行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測試 完整的運行效果是:

image

服務(wù)部署成功

image

訪問成功

image

成功物

插件最新版: v7.32

agent最新版:v6.9

源碼地址:https://github.com/yuzd/AntDeployAgent

交流QQ群:488312978

總結(jié)

以上是生活随笔為你收集整理的netcore一键nssm发布为windows服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。