使用 pm2 守護你的 .NET Core 應用程式
一.守護程序的前世今生
守護程序,英文名:“daemon",也有守護神的意思。守護程序是一個在後臺執行並且不受任何終端控制的程序,不會隨著會話結束而退出。諸如 mysql、apache 等這類程式預設就提供了守護程序或者以守護程序的方式工作,我們熟悉的 “mysqld”、"httpd" 等其中的 d 就是 daemon 的意思。比如我們在 Linux 系統上以命令 dotnet xxx.dll
執行 .NET Core 應用程式時,如果我們結束會話,那麼我們的程式將會結束執行。其原因是 Linux 系統中有一個訊號機制,程序可以通過一系列訊號進行通訊,當用戶結束會話時,會向當前會話的子程序傳送一個 HUP 訊號,一般情況下當前會話的子程序收到HUP訊號以後就會退出自己。 這時我們就需要一個守護程序來管控我們的 .NET Core 應用程式程序。
二.讓程序後臺執行
Linux 下讓程序後臺方式很多,舉栗子:Supervisor、Screen、nohup 命令 等等。Supervisor 是自己建立了一個守護程序,然後讓我們的應用程式程序成為其子程序,通過這種管控方式讓我們的應用程式後臺執行。nohup 顧名思義,就是不向會話程序傳送hup訊號。
在這裡我就搬出本文的主角 pm2,通過 pm2 來讓程序後臺執行。
三. pm2介紹
pm2 從名字上和我們平時在生活中接觸到的 pm2.5 有點像,不過他們可不是一個東西。做 nodejs 開發的童鞋可能對 pm2 比較熟悉,pm2 是一個高階nodejs程序管理工具。
看到這裡,可能有童鞋會有疑問,nodejs程序管理工具怎麼管理 .NET Core 程序?博主經過長期的在 Linux 下的摸爬滾打,最終發現使用pm2來守護 .NET Core 程序完全沒有問題,除了 nodejs 其他的很多程式都是可以的。而且無需繁瑣的配置,安裝、使用、管理程序都非常簡單,這是我選擇它的主要原因。
這裡需要說明一下是使用 pm2 來讓程序後臺執行,因為如果不是 nodejs 程式, pm2的一些為nodejs準備的功能可能是無法使用的,但是對於我們守護 .NET Core 應用程式足夠了。
四.pm2的安裝以及使用
4.1 安裝
4.1.1 安裝 nodejs
使用pm2需要安裝nodejs,這個網上很多資料,就不再本文詳細說明了,我前面寫過一篇在 Centos 7下安裝的文章,傳送門。
4.1.2 安裝 pm2
npm install pm2 -g
就一句話,是不是很簡單。安裝成功以後使用命令 pm2
來檢查是否安裝成功,你會看到如下輸出:
------------- __/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____ _\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___ _\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__ _\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___ _\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____ _\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________ _\/\\\_____________\/\\\_____________\/\\\___/\\\/___________ _\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_ _\///______________\///______________\///__\///////////////__ Runtime Edition PM2 is a Production Process Manager for Node.js applications with a built-in Load Balancer. Start and Daemonize any application: $ pm2 start app.js Load Balance 4 instances of api.js: $ pm2 start api.js -i 4 Monitor in production: $ pm2 monitor Make pm2 auto-boot at server restart: $ pm2 startup To go further checkout: http://pm2.io/ ------------- usage: pm2 [options] <command> pm2 -h, --help all available commands and options pm2 examples display pm2 usage examples pm2 <command> -h help on a specific command Access pm2 files in ~/.pm2
4.2 使用
4.2.1 常用命令
命令 | 說明 |
---|---|
pm2 startup | 設定pm2開機自啟動 |
pm2 unstartup | 移除pm2開機自啟動 |
pm2 save | 儲存當前程序開機自啟動 |
pm2 start [--name ] | 啟動應用程式 |
pm2 list | 顯示所有程序狀態 |
pm2 monit | 監控程序 |
pm2 logs [程序id或名字] | 顯示程序日誌 |
pm2 stop [all] | 停止[所有]程序 |
pm2 restart [all] | 重啟[所有]程序 |
pm2 delete [,all] | 刪除指定[所有]程序 |
pm2 info [程序id或名字] | 檢視應用程式資訊 |
五. 使用 pm2 守護 ASP.NET Core 應用程式
5.1 建立一個 webapi 專案
# 建立專案
dotnet new webapi --no-https -o testwebapi
# 釋出專案
cd testwebapi/
dotnet publish -c Release
cd bin/Release/netcoreapp2.1/publish
# 執行專案
dotnet testwebapi.dll
執行成功會有如下輸出:
5.2 使用pm2守護
5.2.1 啟動
結束我們剛剛執行的程式,就在我們剛剛的目錄執行下面的命令:
pm2 start "dotnet testwebapi.dll" --name testwebapi
執行成功:
我們可以清晰的看到我們的應用程式的 pid、執行狀態、重啟次數(應用程式崩潰重啟/手動重啟)、執行時間、cpu和記憶體佔用等。十分方便
使用 curl 訪問 api 檢查是否執行成功:
curl http://localhost:5000/api/values
5.2.2 檢視日誌
pm2 logs testwebapi
5.2.3 檢視應用程式資訊
pm2 info testwebapi
5.2.4 監控應用程式
pm2 monit testwebapi
5.2.3 重啟策略
pm2 會在你的應用程式異常退出時,自動幫你重啟,所謂異常退出,指退出程式碼非0。
測試:
修改 ValueController 新增退出程式碼為1的程式碼:
釋出,並使用 pm2 啟動(此處略)。
通過 pm2 list
查詢應用程式重啟次數為0:
訪問 api 觸發異常退出:
curl http://localhost:5000/api/values
再次通過 pm2 list
命令查詢可以發現重啟了:
六.結束
pm2 這個工具相對於 Supervisor 和 nohup 來說,對於Supervisor,沒有配置,不用輸很長的命令;對於 nohup 管理程序方便。歡迎大家與我交流。