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(); }
更新服務十分方便:首先使用 nssm stop myHelloWorld 暫停服務,然后用新的發布文件替代以前的發布文件,之后使用 nssm start myHelloWorld 啟動服務即可。打開F:/aaa.txt,內容如下,可以看到重新發布已經生效了。
總結:雖然使用netcore后盡量應該把項目部署在Linux平台上,但是如果公司服務器是Windows Server,且項目要求開機自啟、長期穩定運行,使用nssm簡單方便地將項目部署為Windows服務也是一種不錯的選擇。