NSSM部署Windows服务
1 准备工作
在Windows平台部署Asp.net core应用程序一般采用IIS,但是如果我们的net core应用执行的是定时任务,需要开机自启,稳定运行的话,使用NSSM将其部署为Winodows服务是一种不错的选择。NSSM官网地址:http://www.nssm.cc/。
我们知道netcore应用本质都是Console应用程序,所以这里我们就以一个控制台应用为例演示NSSM部署过程。新建一个控制台项目,项目名为HelloWorld,代码如下:
class Program { static void Main(string[] args) { var tokenSource = new CancellationTokenSource(); //业务,异步执行,每隔1秒输出一次working Task.Factory.StartNew(() => { while (!tokenSource.IsCancellationRequested) { File.AppendAllTextAsync(@"F:\aaa.txt", $"{DateTime.Now.ToString("f")}:working...{Environment.NewLine}"); Thread.Sleep(1000); } }).ContinueWith(t => { File.AppendAllText(@"F:\aaa.txt", $"{DateTime.Now.ToString("f")}:成功退出!"); Environment.Exit(0); }); //读取配置文件,如果配置文件stop为No,主线程休眠1秒 var configuration = new ConfigurationBuilder() .SetBasePath(Environment.CurrentDirectory) .AddJsonFile("setttings.json", optional: true, reloadOnChange: true) .Build(); while ("No".Equals(configuration["stop"], StringComparison.CurrentCultureIgnoreCase)) { Thread.Sleep(1000); } //让异步业务结束 tokenSource.Cancel(); } }
项目执行一个异步任务,每秒在F:/aaa.txt中写入一行 【time:working....】,运行程序后,打开F:/aaa.txt文件,内容如下:
2 NSSM部署
1.发布项目
我们可以使用VS发布项目,也可以使用PowerShell执行以下命令进行发布,发布后的文件存放在D:/Apps/HelloWorld目录下
dotnet publish -o D:/Apps/HelloWorld -c release
2.使用NSSM
下载NSSM,解压后,进入nssm.exe所在目录,在该目录下打开PowerShell。我们通过 nssm install
Application Path:dotnet所在目录,可以通过 where dotnet 命令查找;
Startup directroy:发布文件所在的目录;
Arguments:发布项目后的xxx.dll文件名。
点击按钮就可以创建服务了,使用十分简单, 打开服务管理器,可以看到服务已经安装成功了:
myHelloWorld服务安装成功后,并没有启动,我们可以使用服务管理器来启动、停止服务,当然我们也可以使用nssm来来控制服务的启动、停止、暂停等,常用命令如下:
nssm install//安装服务 nssm remove //卸载服务 nssm start //启动服务 nssm stop //停止服务 nssm restart //重启服务 nssm status //查看服务 nssm pause //暂停服务 nssm continue //继续服务
我们执行 nssm start myHelloWorld 命令来启动服务,查看F:/aaa.txt文件如下,可以看到服务运行正常。
3.服务修改
项目总是不断迭代的, 如果我们的myHelloWorld程序后期进行了修改,代码如下,我们怎么去更新服务呢?
static void Main(string[] args) { var tokenSource = new CancellationTokenSource(); //业务,异步执行,每隔1秒输出一次working Task.Factory.StartNew(() => { while (!tokenSource.IsCancellationRequested) { File.AppendAllTextAsync(@"F:\aaa.txt", $"{DateTime.Now.ToString("f")}:【修改了代码】working...{Environment.NewLine}"); Thread.Sleep(1000); } }).ContinueWith(t => { File.AppendAllText(@"F:\aaa.txt", $"{DateTime.Now.ToString("f")}:成功退出!"); Environment.Exit(0); }); //读取配置文件,如果配置文件stop为No,主线程休眠1秒 var configuration = new ConfigurationBuilder() .SetBasePath(Environment.CurrentDirectory) .AddJsonFile("setttings.json", optional: true, reloadOnChange: true) .Build(); while ("No".Equals(configuration["stop"], StringComparison.CurrentCultureIgnoreCase)) { Thread.Sleep(1000); } //让异步业务结束 tokenSource.Cancel(); }
更新服务十分方便:首先使用 nssm stop myHelloWorld 暂停服务,然后用新的发布文件替代以前的发布文件,之后使用 nssm start myHelloWorld 启动服务即可。打开F:/aaa.txt,内容如下,可以看到重新发布已经生效了。
总结:虽然使用netcore后尽量应该把项目部署在Linux平台上,但是如果公司服务器是Windows Server,且项目要求开机自启、长期稳定运行,使用nssm简单方便地将项目部署为Windows服务也是一种不错的选择。