node进程监控PM2

pm2是什么?它是一个node的进程管理和监控工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。

官方文档

callcheat

# Fork mode
pm2 start app.js --name my-api # Name process

# Cluster mode
pm2 start app.js -i 0 # Will start maximum processes with LB depending on available CPUs
pm2 start app.js -i max # Same as above, but deprecated.
pm2 scale app +3 # Scales `app` up by 3 workers
pm2 scale app 2 # Scales `app` up or down to 2 workers total

# Listing

pm2 list # Display all processes status
pm2 jlist # Print process list in raw JSON
pm2 prettylist # Print process list in beautified JSON

pm2 describe 0 # Display all informations about a specific process

pm2 monit # Monitor all processes

# Logs

pm2 logs [--raw] # Display all processes logs in streaming
pm2 flush # Empty all log files
pm2 reloadLogs # Reload all logs

# Actions

pm2 stop all # Stop all processes
pm2 restart all # Restart all processes

pm2 reload all # Will 0s downtime reload (for NETWORKED apps)

pm2 stop 0 # Stop specific process id
pm2 restart 0 # Restart specific process id

pm2 delete 0 # Will remove process from pm2 list
pm2 delete all # Will remove all processes from pm2 list

# Misc

pm2 reset <process> # Reset meta data (restarted time...)
pm2 updatePM2 # Update in memory pm2
pm2 ping # Ensure pm2 daemon has been launched
pm2 sendSignal SIGUSR2 my-app # Send system signal to script
pm2 start app.js --no-daemon
pm2 start app.js --no-vizion
pm2 start app.js --no-autorestart

命令

日志官方文档

# Display option for pm2 logs command
pm2 logs -h

# Display all apps logs
pm2 logs

# Display only logs about process containing "api" in their name
pm2 logs /api/

# It's a regex so you can filter with the normal syntax to filter with OR condition
pm2 logs /server_[12]/

# Display only api app logs
pm2 logs api

# Display X lines of api log file
pm2 logs big-api --lines 1000

cluster模块

node.js试运行在v8引擎上的,以单线程的方式运行,在多核心处理器的系统中并不能发挥其最大性能。可以使用cluster模块,下面
是一个例子:

var cluster = require('cluster');  
var http = require('http');
var os = require('os');

var numCPUs = os.cpus().length;

if (cluster.isMaster) {
// Master:
// Let's fork as many workers as you have CPU cores

for (var i = 0; i < numCPUs; ++i) {
cluster.fork();
}
} else {
// Worker:
// Let's spawn a HTTP server
// (Workers can share any TCP connection.
// In this case its a HTTP server)

http.createServer(function(req, res) {
res.writeHead(200);
res.end("hello world");
}).listen(8080);
}

pm2替代cluster模块

// 原始代码
var http = require('http');

http.createServer(function(req, res) {
res.writeHead(200);
res.end("hello world");
}).listen(8080);

执行pm2 start app.js -i 4,-i <number of workers>参数用来告诉PM2以cluster_mode的形式运行你的app(对应的叫fork_mode),后面的数字表示要启动的工作线程的数量。如果给定的数字为0,PM2则会根据你CPU核心的数量来生成对应的工作线程。

优点:

  • 不论什么情况下,你的应用将一直运行,如果任意一个工作线程挂了,PM2会立即重启一个。
  • 实时扩展集群,如果你需要增加工作线程的数量,可以通过pm2 scale <app name> <n>来对集群进行扩展。参数指定工作线程的数量,被用来增加或减少集群数。你也可以通过pm2 scale app +3的方式来指定要增加多少工作线程。
  • 生产环境零停机更新。PM2的reload <app name>功能将依次重启所有的工作线程。每一个线程会等待在新的线程创建之后才会被终止掉。
  • 使用gracefulReload功能可以达到相同的目的,不同的是它不会立即终止工作线程,而是通过IPC发送一个shutdown信号来关闭所有当前的连接并处理一些自定义的任务,然后再优雅地退出。
process.on('message', function(msg) {  
if (msg === 'shutdown') {
close_all_connections();
delete_cache();
server.close();
process.exit(0);
}
});

PM2使用

  • 安装 npm install -g pm2
  • 更多命令
# 安装
$ npm install -g pm2
# 启动 --name tank是给这个进程取个名字
$ pm2 start index.js --name tankName

# 常用命令
$pm2 stop <app_name|id|all> 停止

$pm2 delete <app_name|id|all> 删除

$pm2 restart <app_name|id|all> 重启

$pm2 reload <app_name|id|all> 重载

跟多命令


$ pm2 start app.js -i 4 #后台运行pm2,启动4个app.js
# 也可以把'max' 参数传递给 start
# 正确的进程数目依赖于Cpu的核心数目
$ pm2 start app.js --name my-api # 命名进程
$ pm2 list # 显示所有进程状态
$ pm2 monit # 监视所有进程
$ pm2 logs # 显示所有进程日志
$ pm2 stop all # 停止所有进程
$ pm2 restart all # 重启所有进程
$ pm2 reload all # 0秒停机重载进程 (用于 NETWORKED 进程)
$ pm2 stop 0 # 停止指定的进程
$ pm2 restart 0 # 重启指定的进程
$ pm2 startup # 产生 init 脚本 保持进程活着
$ pm2 web # 运行健壮的 computer API endpoint (http://localhost:9615)
$ pm2 delete 0 # 杀死指定的进程
$ pm2 delete all # 杀死全部进程

运行进程的不同方式:
$ pm2 start app.js -i max # 根据有效CPU数目启动最大进程数目
$ pm2 start app.js -i 3 # 启动3个进程
$ pm2 start app.js -x #用fork模式启动 app.js 而不是使用 cluster
$ pm2 start app.js -x -- -a 23 # 用fork模式启动 app.js 并且传递参数 (-a 23)
$ pm2 start app.js --name serverone # 启动一个进程并把它命名为 serverone
$ pm2 stop serverone # 停止 serverone 进程
$ pm2 start app.json # 启动进程, 在 app.json里设置选项
$ pm2 start app.js -i max -- -a 23 #在--之后给 app.js 传递参数
$ pm2 start app.js -i max -e err.log -o out.log # 启动 并 生成一个配置文件
你也可以执行用其他语言编写的app ( fork 模式):
$ pm2 start my-bash-script.sh -x --interpreter bash
$ pm2 start my-python-script.py -x --interpreter python

0秒停机重载:
这项功能允许你重新载入代码而不用失去请求连接。
注意:
仅能用于web应用
运行于Node 0.11.x版本
运行于 cluster 模式(默认模式)
$ pm2 reload all

CoffeeScript:
$ pm2 start my_app.coffee #这就是全部

PM2准备好为产品级服务了吗?
只需在你的服务器上测试
$ git clone https://github.com/Unitech/pm2.git
$ cd pm2
$ npm install # 或者 npm install --dev ,如果devDependencies 没有安装
$ npm test

错误日志位置:

error log path /root/.pm2/pids/anaweb-13.pid

错误日志,出现启动 error找她就没错

out log path /root/.pm2/logs/anaweb-out-13.log

参考1: https://cnodejs.org/topic/5021c2cff767cc9a51e684e3
参考2: http://tcrct.iteye.com/blog/2043644
forever github: https://github.com/foreverjs/forever