前言
PM2是一个针对node应用的进程管理器。保持应用永远处于活动状态,无停机重新加载,以及常见的系统管理任务。
支持系统:Linux, MacOSx, Windows
Quick Start
安装
npm install pm2 -g
启动应用程序
切换到应用程序的工程目录
pm2 start app.js
常用命令
# General
$ npm install pm2 -g # pm2安装
$ pm2 start app.js # 启动应用(node方式)
$ pm2 start app.py # 启动应用(pythos方式)
$ pm2 start npm -- start # 启动Node应用
# Cluster Mode (Node.js only)
$ pm2 start app.js -i 4 # 在集群模式下启动4个实例
# it will load balance network queries to each app
$ pm2 reload all # 0秒重启所有应用
$ pm2 gracefulReload all # Send exit message then reload (for networked apps)
$ pm2 scale [app-name] 10 # 将指定app扩展或缩小到10个进程
# Process Monitoring
$ pm2 list # 列出通过pm2启动的所有应用
$ pm2 jlist # 列出应用列表以原生json方式
$ pm2 prettylist # 列出应用列表以美化了的json方式(格式化,还没有验证)
$ pm2 monit # 列出每个应用的内存和CPU使用情况
$ pm2 show|describe [app-name] # 列出指定应用程序的所有信息
# Log management
$ pm2 logs # 显示所有app的log
$ pm2 logs [app-name] # 显示指定app的log
$ pm2 logs --json # 以json显示显示log
$ pm2 flush # 清空所有的log文件内容
$ pm2 reloadLogs # 重新加载所有的log
$ pm2 start app.js -e err.log -o out.log # Start and specify error and out log
# Process State Management
$ pm2 start app.js --name="api" # 启动一个应用,并且命名为api
$ pm2 start app.js -- -a 34 # 启动应用,参数为"-a 34"
$ pm2 start app.js --node-args="--debug=7001" # 针对node V8给出指定参数
$ pm2 start app.js --log-date-format "YYYY-MM-DD HH:mm Z" # log前面会带以指定时间格式化前缀
$ pm2 start app.js --watch # 启动应用,并添加watch功能
$ pm2 start script.sh # 启动script.sh文件
$ pm2 start app.json # 启动在app.json中配置的所有文件
$ pm2 reset [app-name] # Reset all counters
$ pm2 stop all # 停止所有app
$ pm2 stop 0 # 停止指定id的app
$ pm2 restart all # 重启所有app
$ pm2 gracefulReload all # 在集群cluster模式下重新加载所有app
$ pm2 delete all # 销毁并删除所有app
$ pm2 delete 0 # 删除id是0的app
# Startup/Boot management
$ pm2 startup # 在启动时,检测系统初始化,生成和配置pm2 boot
$ pm2 save # 保存当前进程列表
$ pm2 resurrect # 恢复以前保存的进程
$ pm2 unstartup # 禁用和删除启动系统
$ pm2 update # pm2更新
$ pm2 generate # 生成一个简单的json配置文件(app相关配置)
# Deployment(部署)
$ pm2 deploy app.json prod setup # Setup "prod" remote server
$ pm2 deploy app.json prod # Update "prod" remote server
$ pm2 deploy app.json prod revert 2 # Revert "prod" remote server by 2
# Module system
$ pm2 module:generate [name] # Generate sample module with name [name]
$ pm2 install pm2-logrotate # Install module (here a log rotation system)
$ pm2 uninstall pm2-logrotate # Uninstall module
$ pm2 publish # Increment version, git push and npm publish
参数 Options
-h, --help 输出使用信息
-V, --version 输出版本号
-v --version 获取版本号
-s --silent 隐藏所有信息
-m --mini-list display a compacted list without formatting 显示未格式化的压缩列表
-f --force 强制操作
-n --name <name> set a <name> for script 为脚本设置名称
-i --instances <number> launch [number] instances (for networked app)(load balanced) 指定启动多少实例
-l --log [path] 指定日志文件路径 (error and out are both included)
-o --output <path> 指定输出日志文件路径
-e --error <path> 指定错误日志文件路径
-p --pid <pid> specify pid file 指定pid文件
--max-memory-restart <memory> specify max memory amount used to autorestart (in megaoctets) 指定用于自动启动的最大内存量
--env <environment_name> specify environment to get specific env variables (for JSON declaration) 指定环境
-x --execute-command execute a program using fork system 使用fork系统执行程序
-u --user <username> define user when generating startup script 在生成启动脚本时定义用户
-c --cron <cron_pattern> restart a running process based on a cron pattern 基于cron模式重启正在运行的程序
-w --write write configuration in local folder 在本地文件夹中写入配置
--interpreter <interpreter> the interpreter pm2 should use for executing app (bash, python...) 执行app,pm2使用的翻译者
--log-date-format <momentjs format> add custom prefix timestamp to logs 将自定义的时间戳前缀添加到log文件中去
--no-daemon run pm2 daemon in the foreground if it doesn't exist already
--merge-logs merge logs from different instances but keep error and out separated 从不同实例合并日志,但保持错误和输出分离
--watch watch application folder for changes 监听应用程序文件的改变
--ignore-watch <folders|files> folder/files to be ignored watching, chould be a specific name or regex - e.g. --ignore-watch="test node_modules "some scripts"" 忽略指定的文件或文件夹的监听
--node-args <node_args> space delimited arguments to pass to node in cluster mode - e.g. --node-args="--debug=7001 --trace-deprecation" 指定node参数
--no-color skip colors
--no-vizion skip vizion features (versioning control)
--no-autorestart do not automatically restart apps 不会自动重启app
应用程序声明
你可以创建配置文件来管理多个应用程序。
pm2 ecosystem
生成一个简单的配置,ecosystem.config.js。具体说明
然后你就可以轻松的管理你的应用
# 启动所有应用
$ pm2 start ecosystem.config.js
# 只开始名为worker-app的应用
$ pm2 start ecosystem.config.js --only worker-app
# 停止所有应用
$ pm2 stop ecosystem.config.js
# 重启所有应用
$ pm2 start ecosystem.config.js
## Or
$ pm2 restart ecosystem.config.js
# 重新加载所有应用
$ pm2 reload ecosystem.config.js
# 删除所有应用
$ pm2 delete ecosystem.config.js
# 启动应用并指定环境
$ pm2 start ecosystem.config.js --env [environment_name]
# 默认情况下,pm2启动后,环境是不变的,除非你告诉pm2要更新配置。所以使用--update-env选项。请注意一些选项将不被更新
$ pm2 restart|start|reload ecosystem.config.js --update-env
注意: 此处“所有”都是ecosystem.config.js中指定的
更新pm2
- 安装最新的pm2版本
$ npm install pm2@latest -g
- 然后更新内存中的pm2
$ pm2 update
Process Management
Managing applications states
pm2是一个进程管理器。它管理你的app状态,所以你可以启动,停止,重启以及删除进程。
- 启动一个应用程序:
$ pm2 start app.js --name "my-api"
$ pm2 start web.js --name "web-interface"
- 停止web-interface
$ pm2 stop web-interface
- 重启
$ pm2 restart web-interface
NB: starting PM2 2.1.x, restarts are immutable, meaning that environnement changes will not change your process, see –update-env
- 删除指定的app从pm2进程列表中
$ pm2 delete web-interface
从pm2 2.4.0开始,你可以restart/delete/stop/reload app通过正则表达式。比如:你想restart http-1和http-2,但不包括http-3
$ pm2 restart /http-[1,2]/
注意:正则表达式通过’/’来指定开始和结束,仅仅指定一个app的name,不包括process id
Process listing
- 列出所有正在运行的程序
$ pm2 list
# Or
$ pm2 [list|ls|l|status]
- 获取更多的信息,关于一个指定的进程
$ pm2 show 0
Start any process type
- 用其他语言启动脚本
$ pm2 start echo.pl --interpreter=perl
$ pm2 start echo.coffee
$ pm2 start echo.php
$ pm2 start echo.py
$ pm2 start echo.sh
$ pm2 start echo.rb
- 默认的解析器列表
{
".sh": "bash",
".py": "python",
".rb": "ruby",
".coffee" : "coffee",
".php": "php",
".pl" : "perl",
".js" : "node"
}
Binary code execution
二进制代码执行
$ pm2 start ./binary-app
Process configuration
运行一个非JS解释器必须设置exec_mode为fork_mode和exec_interpreter为你所选择的翻译器。例如:
{
"apps" : [{
"name" : "bash-worker",
"script" : "./a-bash-script",
"exec_interpreter": "bash",
"exec_mode" : "fork_mode"
}, {
"name" : "ruby-worker",
"script" : "./some-ruby-script",
"exec_interpreter": "ruby",
"exec_mode" : "fork_mode"
}]
}
Max Memory Restart
pm2允许基于一定内存限制重启app.
请注意,最大内存重新启动项是优雅的(graceful ,找不到合适的翻译)
CLI
$ pm2 start big-array.js --max-memory-restart 20M
JSON
{
"name" : "max_mem",
"script" : "big-array.js",
"max_memory_restart" : "20M"
}
Programmatic
pm2.start({
name : "max_mem",
script : "big-array.js",
max_memory_restart : "20M"
}, function(err, proc) {
// Processing
});
Units
单位可以是 K(ilobyte), M(egabyte), G(igabyte).
50M
50K
1G