一登钥、簡介
pm2是一個帶有負(fù)載均衡功能的應(yīng)用進程管理器铆惑,類似有Supervisor掏颊,forever。
二瘦癌、安裝
Linux Binaries下載地址:https://nodejs.org/dist
cdoneinstack/src
wget https://nodejs.org/dist/v4.2.4/node-v4.2.4-linux-x64.tar.gz
tar?xzf?node-v4.2.4-linux-x64.tar.gz
cp?node-v4.2.4-linux-x64/bin/node?/usr/local/bin/
cp?-R?node-v4.2.4-linux-x64/lib/node_modules?/usr/local/lib/
ln?-s?/usr/local/lib/node_modules/npm/bin/npm-cli.js?/usr/local/bin/npm
npm?install?pm2@latest?-g #安裝最新版本pm2模塊
PS: 如果你的主機無法連接公網(wǎng)眼耀,先找到能連公網(wǎng)的主機安裝上面的方法安裝pm2,然后拷貝到你要安裝的主機佩憾∠埃拷貝如下目錄:
/usr/local/bin/node
/usr/local/lib/node_modules
再創(chuàng)建相關(guān)軟連接
三、PM2常用命令
假設(shè)你現(xiàn)在已經(jīng)寫好了一個app.js的文件妄帘,需要啟動楞黄,你可以使用pm2進行管理
1. 啟動
# pm2?start?app.js
# pm2?start?app.js?--name?my-api#my-api為PM2進程名稱
# pm2?start?app.js?-i?0#根據(jù)CPU核數(shù)啟動進程個數(shù)
# pm2?start?app.js?--watch#實時監(jiān)控app.js的方式啟動,當(dāng)app.js文件有變動時抡驼,pm2會自動reload
2. 查看進程
# pm2list
# pm2?show?0?或者#?pm2?info?0??#查看進程詳細(xì)信息鬼廓,0為PM2進程id
3. 監(jiān)控
#?pm2?monit
4. 停止
#?pm2?stop?all??#停止PM2列表中所有的進程
#?pm2?stop?0????#停止PM2列表中進程為0的進程
5. 重載
#?pm2?reload?all????#重載PM2列表中所有的進程
#?pm2?reload?0?????#重載PM2列表中進程為0的進程
6. 重啟
#?pm2?restart?all?????#重啟PM2列表中所有的進程
#?pm2?restart?0??????#重啟PM2列表中進程為0的進程
7. 刪除PM2進程
#?pm2?delete?0?????#刪除PM2列表中進程為0的進程
#?pm2?delete?all???#刪除PM2列表中所有的進程
8. 日志操作
#?pm2?logs?[--raw]???#Display?all?processes?logs?in?streaming
#?pm2?flush??????????????#Empty?all?log?file
#?pm2?reloadLogs????#Reload?all?logs
9. 升級PM2
#?npm?install?pm2@lastest?-g???#安裝最新的PM2版本
#?pm2?updatePM2????????????????????#升級pm2
10. 更多命令參數(shù)請查看幫助
#?pm2?--help
四、PM2目錄結(jié)構(gòu)
默認(rèn)的目錄是:當(dāng)前用于的家目錄下的.pm2目錄(此目錄可以自定義致盟,請參考:五碎税、自定義啟動文件),詳細(xì)信息如下:
$HOME/.pm2#will?contain?all?PM2?related?files
$HOME/.pm2/logs#will?contain?all?applications?logs
$HOME/.pm2/pids#will?contain?all?applications?pids
$HOME/.pm2/pm2.log#PM2?logs
$HOME/.pm2/pm2.pid#PM2?pid
$HOME/.pm2/rpc.sock#Socket?file?for?remote?commands
$HOME/.pm2/pub.sock#Socket?file?for?publishable?events
$HOME/.pm2/conf.js#PM2?Configuration
五馏锡、自定義啟動文件
創(chuàng)建一個test.json的示例文件雷蹂,格式如下:
{
"apps":
{
"name":?"test",
"cwd":?"/data/wwwroot/nodejs",
"script":?"./test.sh",
"exec_interpreter":?"bash",
"min_uptime":?"60s",
"max_restarts":?30,
"exec_mode"?:?"cluster_mode",
"error_file"?:?"./test-err.log",
"out_file":?"./test-out.log",
"pid_file":?"./test.pid"
"watch":?false
}
}
說明:
apps:json結(jié)構(gòu),apps是一個數(shù)組杯道,每一個數(shù)組成員就是對應(yīng)一個pm2中運行的應(yīng)用
name:應(yīng)用程序的名稱
cwd:應(yīng)用程序所在的目錄
script:應(yīng)用程序的腳本路徑
exec_interpreter:應(yīng)用程序的腳本類型匪煌,這里使用的shell,默認(rèn)是nodejs
min_uptime:最小運行時間党巾,這里設(shè)置的是60s即如果應(yīng)用程序在60s內(nèi)退出萎庭,pm2會認(rèn)為程序異常退出,此時觸發(fā)重啟max_restarts設(shè)置數(shù)量
max_restarts:設(shè)置應(yīng)用程序異常退出重啟的次數(shù)齿拂,默認(rèn)15次(從0開始計數(shù))
exec_mode:應(yīng)用程序啟動模式驳规,這里設(shè)置的是cluster_mode(集群),默認(rèn)是fork
error_file:自定義應(yīng)用程序的錯誤日志文件
out_file:自定義應(yīng)用程序日志文件
pid_file:自定義應(yīng)用程序的pid文件
watch:是否啟用監(jiān)控模式署海,默認(rèn)是false吗购。如果設(shè)置成true,當(dāng)應(yīng)用程序變動時叹侄,pm2會自動重載巩搏。這里也可以設(shè)置你要監(jiān)控的文件昨登。
詳細(xì)參數(shù)列表:見附件八
六趾代、實例
已上面的test.json為例
#?cat?>?/data/wwwroot/nodejs/test.sh?<<?EOF
#!/bin/bash
while:
do
echo?"Test"?>>?1.log
sleep?5
done
EOF
#?chmod?+x?test.sh??????#添加執(zhí)行權(quán)限
#?pm2?start?test.json????#啟動,如下圖:
#?pm2?list????#查看pm2進程丰辣,如下圖:
七撒强、備注
其他可參數(shù)見官網(wǎng):http://pm2.keymetrics.io
八禽捆、附件
FieldTypeExampleDescription
namestring"myAPI"name your app will have in PM2
scriptstring"bin/app.js"path of your app
argslist["--enable-logs", "-n", "15"]arguments given to your app when it is launched
node_argslist["--harmony", "--max-stack-size=1024"]arguments given to node when it is launched
cwdstring"/var/www/app/prod"the directory from which your app will be launched
exec_modestring"cluster""fork" mode is used by default, "cluster" mode can be configured with instances field
instancesnumber4number of instances for your clustered app, 0 means as much instances as you have CPU cores. a negative value means CPU cores - value (e.g -1 on a 4 cores machine will spawn 3 instances)
exec_interpreterstring"node"defaults to "node". can be "python", "ruby", "bash" or whatever interpreter you wish to use. "none" will execute your app as a binary executable
log_date_formatstring"YYYY-MM-DD HH:mm Z"format in which timestamps will be displayed in the logs
error_filestring"/var/log/node-app/node-app.stderr.log"path to the specified error log file. PM2 generates one by default if not specified and you can find it by typing pm2 desc
out_filestring"/var/log/node-app/node-app.stdout.log"path to the specified output log file. PM2 generates one by default if not specified and you can find it by typing pm2 desc
pid_filestring"pids/node-geo-api.pid"path to the specified pid file. PM2 generates one by default if not specified and you can find it by typing pm2 desc
merge_logsbooleanfalsedefaults to false. if true, it will merge logs from all instances of the same app into the same file
cron_restartstring"1 0 * * *"a cron pattern to restart your app. only works in "cluster" mode for now. soon to be avaible in "fork" mode as well
watchbooleantrueenables the watch feature, defaults to "false". if true, it will restart your app everytime a file change is detected on the folder or subfolder of your app.
ignore_watchlist["[\/\\]\./", "node_modules"]list of regex to ignore some file or folder names by the watch feature
min_uptimenumber1000min uptime of the app to be considered started (i.e. if the app crashes in this time frame, the app will only be restarted the number set in max_restarts (default 15), after that it's errored)
max_restartsnumber10number of consecutive unstable restarts (less than 1sec interval or custom time via min_uptime) before your app is considered errored and stop being
max_memory_restartstring"150M"your app will be restarted by PM2 if it exceeds the amount of memory specified. human-friendly format : it can be "10M", "100K", "2G" and so on...
envobject{"NODE_ENV": "production", "ID": "42"}env variables which will appear in your app
autorestartbooleanfalsetrue by default. if false, PM2 will not restart your app if it crashes or ends peacefully
vizionbooleanfalsetrue by default. if false, PM2 will start without vizion features (versioning control metadatas)
post_updatelist["npm install", "echo launching the app"]a list of commands which will be executed after you perform a Pull/Upgrade operation from Keymetrics dashboard
forcebooleantruedefaults to false. if true, you can start the same script several times which is usually not allowed by PM2
next_gen_jsbooleantruedefaults to false. if true, PM2 will launch your app using embedded BabelJS features which means you can run ES6/ES7 javascript code
restart_delaynumber4000time to wait before restarting a crashed app (in milliseconds). defaults to 0.
原文地址:https://blog.linuxeye.cn/435.html