我是靠谱客的博主 活泼花生,最近开发中收集的这篇文章主要介绍PM2进程管理器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

什么是PM2 ?

pm2 是一个带有负载均衡功能的Node应用的进程管理器.当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的,下面我们来看pm2常用的命令用法介绍吧。

PM2 (github上的源码)是开源的基于Nodejs的进程管理器,包括守护进程,监控,日志的一整套完整的功能,基本是Nodejs应用程序不二的守护进程选择,事实上它并不仅仅可以启动Nodejs的程序,只要是一般的脚本的程序它同样可以胜任。

PM2常用命令

假设你现在已经写好了一个app.js的文件,需要启动,你可以使用pm2进行管理

1. 启动

# pm2 start app.js
# pm2 start app.js --name my-api
#my-api为PM2进程名称
# pm2 start app.js -i 0
#根据CPU核数启动进程个数
# pm2 start app.js --watch
#实时监控app.js的方式启动,当app.js文件有变动时,pm2会自动reload

2. 查看进程

# pm2 list
# pm2 show 0 或者 # pm2 info 0
#查看进程详细信息,0为PM2进程id

3. 监控

# 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
# 显示所有应用程序的日志
# pm2 logs [app-name]
# 显示指定应用程序的日志
# pm2 flush
#Empty all log file
# pm2 reloadLogs
#Reload all logs

9. 升级PM2

# npm install pm2@lastest -g
#安装最新的PM2版本
# pm2 updatePM2
#升级pm2

10.配置文件模板

# pm2 generate
# 生成一个简单的json配置文件

pm2常用参数

--watch:
监听应用目录的变化,一旦发生变化,自动重启。如果要精确监听、不见听的目录,最好通过配置文件。
-i --instances:
启用多少个实例,可用于负载均衡。如果-i 0或者-i max,则根据当前机器核数确定实例数目。
--ignore-watch:
排除监听的目录/文件,可以是特定的文件名,也可以是正则。比如--ignore-watch="test node_modules some_scripts".
-n --name:
应用的名称。查看应用信息的时候可以用到。

PM2使用配置文件启动任务

{
"apps":
{
"name": "test",
"cwd": "/data/wwwroot/nodejs",
"script": "./test.js",
"exec_interpreter": "nodejs",
"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结构,apps是一个数组,每一个数组成员就是对应一个pm2中运行的应用。
name:应用程序的名称。
cwd:应用程序所在的目录。
script:应用程序的脚本路径。
exec_interpreter:应用程序的脚本类型,默认是nodejs。
min_uptime:最小运行时间,这里设置的是60s即如果应用程序在60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量。
max_restarts:设置应用程序异常退出重启的次数,默认15次(从0开始计数)。
exec_mode:应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork。
error_file:自定义应用程序的错误日志文件。
out_file:自定义应用程序日志文件。
pid_file:自定义应用程序的pid文件。
watch:是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件。

监控文件:

{
"watch": ["server", "client"],
"ignore_watch" : ["node_modules", "client/img"],
"watch_options": {
"followSymlinks": false
}
}

另外一个实例:

{
"name"
: "fis-receiver",
// 应用名称
"script"
: "./bin/www",
// 实际启动脚本
"cwd"
: "./",
// 当前工作路径
"watch": [
// 监控变化的目录,一旦变化,自动重启
"bin",
"routers"
],
"ignore_watch" : [
// 从监控目录中排除
"node_modules",
"logs",
"public"
],
"watch_options": {
"followSymlinks": false
},
"error_file" : "./logs/app-err.log",
// 错误日志路径
"out_file"
: "./logs/app-out.log",
// 普通日志路径
}

环境配置声明

首先,在配置文件中,通过env选项声明多个环境配置。简单说明下:

  • env为默认的环境配置(生产环境),env_devenv_test则分别是开发、测试环境。可以看到,不同环境下的NODE_ENVREMOTE_ADDR字段的值是不同的。
  • 在应用中,可以通过process.env.REMOTE_ADDR等来读取配置中生命的变量。

"env": {
"NODE_ENV": "production",
"REMOTE_ADDR": "http://www.example.com/"
},
"env_dev": {
"NODE_ENV": "development",
"REMOTE_ADDR": "http://wdev.example.com/"
},
"env_test": {
"NODE_ENV": "test",
"REMOTE_ADDR": "http://wtest.example.com/"
}

启动指明环境:

假设通过下面启动脚本(开发环境),那么,此时process.env.REMOTE_ADDR的值就是相应的 http://wdev.example.com/,可以自己试验下。

pm2 start app.js --env dev

CMD设置环境变量:

#node中常用的到的环境变量是NODE_ENV,首先查看是否存在
set NODE_ENV
#如果不存在则添加环境变量
set NODE_ENV=production
node app.js

powershell:

#node中常用的到的环境变量是NODE_ENV,首先查看是否存在
$env:NODE_ENV
#如果不存在则添加环境变量
$env:NODE_ENV="production"
node app.js

什么是process模块?

process模块用来与当前进程互动,可以通过全局变量process访问,不必使用require命令加载。

process对象提供一系列属性,用于返回系统信息:

  • process.pid:当前进程的进程号。
  • process.version:Node的版本,比如v0.10.18。
  • process.platform:当前系统平台,比如Linux。
  • process.title:默认值为“node”,可以自定义该值。
  • process.argv:当前进程的命令行参数数组。
  • process.env:指向当前shell的环境变量,比如process.env.HOME。
  • process.execPath:运行当前进程的可执行文件的绝对路径。

process对象提供以下方法:

  • process.exit():退出当前进程。
  • process.cwd():返回运行当前脚本的工作目录的路径。
  • process.chdir():改变工作目录。
  • process.nextTick():将一个回调函数放在下次事件循环的顶部。

nextTick详解

在这种处理模式下,process.nextTick()的意思就是定义出一个动作,并且让这个动作在下一个事件轮询的时间点上执行。我们来看一个例子。例子中有一个foo(),你想在下一个时间点上调用他,可以这么做:

function foo() {
console.error('foo');
}
process.nextTick(foo);
console.error('bar');

运行上面的代码,你从下面终端打印的信息会看到,"bar"的输出在“foo”的前面。这就验证了上面的说法,foo()是在下一个时间点运行的。

bar
foo

你也可以使用setTimeout()函数来达到貌似同样的执行效果:

setTimeout(foo, 0);
console.log('bar');

但在内部的处理机制上,process.nextTick()和setTimeout(fn, 0)是不同的,process.nextTick()不是一个单纯的延时,他有更多的特性。

更精确的说,process.nextTick()定义的调用会创建一个新的子堆栈。在当前的栈里,你可以执行任意多的操作。但一旦调用netxTick,函数就必须返回到父堆栈。然后事件轮询机制又重新等待处理新的事件,如果发现nextTick的调用,就会创建一个新的栈。

在下面的例子里有一个compute(),我们希望这个函数尽可能持续的执行,来进行一些运算密集的任务。

但与此同时,我们还希望系统不要被这个函数堵塞住,还需要能响应处理别的事件。这个应用模式就像一个单线程的web服务server。在这里我们就可以使用process.nextTick()来交叉执行compute()和正常的事件响应。

var http = require('http');
function compute() {
// performs complicated calculations continuously
// ...
process.nextTick(compute);
}
http.createServer(function(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World');
}).listen(5000, '127.0.0.1');
compute();

在这种模式下,我们不需要递归的调用compute(),我们只需要在事件循环中使用process.nextTick()定义compute()在下一个时间点执行即可。在这个过程中,如果有新的http请求进来,事件循环机制会先处理新的请求,然后再调用compute()。反之,如果你把compute()放在一个递归调用里,那系统就会一直阻塞在compute()里,无法处理新的http请求了。

当然,我们无法通过process.nextTick()来获得多CPU下并行执行的真正好处,这只是模拟同一个应用在CPU上分段执行而已。

最后

以上就是活泼花生为你收集整理的PM2进程管理器的全部内容,希望文章能够帮你解决PM2进程管理器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部