• netcore项目在Windows部署:使用NSSM部署Windows服务


    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 <SerivceName> 命令创建服务,执行命令后后弹出服务安装窗口,如下图:

    Application Path:dotnet所在目录,可以通过 where dotnet 命令查找;

    Startup directroy:发布文件所在的目录;

    Arguments:发布项目后的xxx.dll文件名。

      点击按钮就可以创建服务了,使用十分简单, 打开服务管理器,可以看到服务已经安装成功了:

      myHelloWorld服务安装成功后,并没有启动,我们可以使用服务管理器来启动、停止服务,当然我们也可以使用nssm来来控制服务的启动、停止、暂停等,常用命令如下:

    nssm install <servicename>          //安装服务
    nssm remove <servicename>           //卸载服务
    nssm start <servicename>            //启动服务
    nssm stop <servicename>             //停止服务
    nssm restart <servicename>          //重启服务
    nssm status <servicename>           //查看服务
    nssm pause <servicename>            //暂停服务
    nssm continue <servicename>         //继续服务

      我们执行 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();
            }
    View Code

      更新服务十分方便:首先使用  nssm stop myHelloWorld 暂停服务,然后用新的发布文件替代以前的发布文件,之后使用 nssm start myHelloWorld 启动服务即可。打开F:/aaa.txt,内容如下,可以看到重新发布已经生效了。

     

    总结:虽然使用netcore后尽量应该把项目部署在Linux平台上,但是如果公司服务器是Windows Server,且项目要求开机自启、长期稳定运行,使用nssm简单方便地将项目部署为Windows服务也是一种不错的选择。

  • 相关阅读:
    C++中字符串与字符串函数的使用
    面试题17:打印从1到最大的n位数
    动态规划:0-1背包
    POJ 2386 Lake Counting (简单深搜)
    HDU 2612 Find a way 简单广搜
    POJ 3669 Meteor Shower (BFS+预处理)
    深搜(DFS)广搜(BFS)详解
    HDU6055 Regular polygon(计算几何)
    hdu 6047 Maximum Sequence 贪心
    hdu 6045 Is Derek lying?(思维推导)
  • 原文地址:https://www.cnblogs.com/wyy1234/p/10544244.html
Copyright © 2020-2023  润新知