环境:
- window10 x64企业版
- vs2019
- asp.net core 3.1
- nssm2.24-101
nssm官网:http://nssm.cc/,nssm使用文档:http://www.nssm.cc/usage
网盘下载地址:
链接:https://pan.baidu.com/s/1eaIVQABoV_0S4Ru0gi0aig
提取码:lctv
我们知道,使用asp.net core开发好的程序可以直接双击运行,因为它自带kestrel
,是一个标准的控制台应用程序。
那么有什么办法让它变成一个window服务呢?
一、将exe程序变为window服务的方法
-
方法一: 使用
Microsoft.Extensions.Hosting.WindowsServices
这个是微软提供的主机托管扩展包,具体参考《.netcore入门27:使用window服务托管asp.net core网站》 -
方法二: 使用
topshelf
具体参考《ASP.NET Core使用TopShelf部署Windows服务》 -
方法三: 使用
nssm.exe
使用nssm.exe
可以将任意控制台程序制作成window服务,相比前两种,nssm.exe对代码没有任何的侵入性,我们只管将编译好的代码交给nssm就可以了,下面就实验这种方式:
二、实验将asp.net core控制台程序安装为window服务
-
步骤一:新建空的
asp.net core
工程webempty
; -
步骤二:将这个工程直接发布到文件夹,如下:
-
步骤三:在一个目录里准备好
nssm.exe
程序,如下:
注意:安装后的window服务指向的路径为nssm.exe,所以一旦使用后不要再移动
nssm.exe
,后面有截图… -
步骤四:在
nssm.exe
程序所在目录下运行命令行nssm.exe install
,弹框如下:
-
步骤五:设置服务名称和运行的exe路径
-
步骤六:设置显示的服务名称和说明信息(以及启动模式)
-
步骤七:点击
Install service
,完成安装:
此时,我们就可以在window服务后台看到了:
刚安装后,它不会自动启动,需要我们手工启动一下,之后它自己就可以随着操作系统启动了。
还有,如果应用程序因为运行期间报错挂掉的话,nssm.exe是自动让应用程序重启的。
另外,因为安装后的服务指向的路径是nssm.exe
程序的路径,所以我们需要将nssm.exe
文件的路径固定住,不要随便移动它,可以通过服务的属性看到:
三、nssm.exe
扩展之使用指定的文件接收exe程序的控制台输出
我们可以在安装服务的时候指定用一个文件替换控制台作为标准输出,也就是说你代码中的Console.WriteLine("....")
输出的内容会被重定向到你指定的文件中,如下图所示:
当我们启动服务后,发现文件内的输出:
四、nssm.exe
扩展之设置exe程序运行时的环境变量
对于asp.net core应用程序来说,程序的运行环境很重要,微软提供了三种环境(Development
、Staging
和Production
),当我们使用vs进行调试时是Development
,而当我们直接双击生成的exe运行时是Production
,其实我们可以扩充自己需要的环境种类并直接exe程序运行时的环境。
如下图,将程序运行的环境手动设置为:Development
:
五、附:nssm常用命令
启动服务:nssm start <servicename>
停止服务: nssm stop <servicename>
重启服务: nssm restart <servicename>
编辑服务:nssm edit <servicename>
移除服务:nssm remove <servicename>
服务自动化需要使用更多的命令行,具体参看官方文档: https://nssm.cc/commands
如下是一个官方安装Jenkins服务的示例:
nssm install Jenkins %PROGRAMFILES%\Java\jre7\bin\java.exe
nssm set Jenkins AppParameters -jar slave.jar -jnlpUrl https://jenkins/computer/%COMPUTERNAME%/slave-agent.jnlp -secret redacted
nssm set Jenkins AppDirectory C:\Jenkins
nssm set Jenkins AppStdout C:\Jenkins\jenkins.log
nssm set Jenkins AppStderr C:\Jenkins\jenkins.log
nssm set Jenkins AppStopMethodSkip 6
nssm set Jenkins AppStopMethodConsole 1000
nssm set Jenkins AppThrottle 5000
nssm start Jenkins