本文是对官方文档的总结
可以查看 官方文档 了解更多
常用命令
启动
- 启动应用程序
pm2 start index.js
可以启动任何类型的应用程序,例如 bash 命令、脚本、二进制文件$ pm2 start "npm run start" $ pm2 start "ls -la" $ pm2 start app.py
因为我是用的是阿里云的nodejs性能监控平台,所以使用了命令
pm2 start "ENABLE_NODE_LOG=YES npm run dev"
- 启动并显示日志流
$ pm2 start api.js --attach
重启
- 重新启动应用程序
$ pm2 restart index.js
- 重新启动所有应用程序
$ pm2 restart all
停止
- 停止指定的应用程序
$ pm2 stop api
- 全部停止
$ pm2 stop all
删除
- 要停止和删除应用程序
$ pm2 delete api
- 要将它们全部删除
$ pm2 delete all
列出应用程序
- 列出所有正在运行的应用程序
$ pm2 list # Or $ pm2 [list|ls|l|status]
显示应用程序元数据
$ pm2 show api
日志
- 日志文件位于文件夹中
$HOME/.pm2/logs
- 显示日志
pm2 logs
- 指定日志的显示行数
# Display 1000 lines of api log file pm2 logs big-api --lines 1000
- 清空日志
pm2 flush pm2 flush <api> # Clear the logs for the app with name/id matching <api>
- 选项
-l --log [path] specify filepath to output both out and error logs -o --output <path> specify out log file -e --error <path> specify error log file --time prefix logs with standard formated timestamp --log-date-format <format> prefix logs with custom formated timestamp --merge-logs when running mutiple process with same app name, do not split file by id
- 为日志添加日期前缀
$ pm2 start app.js --time # Or a running app $ pm2 restart app --time
日志大小限制
模块pm2-logrotate使用有限的磁盘空间自动轮换并保留所有日志文件。
要安装它:
pm2 install pm2-logrotate
在此处阅读有关 pm2-logrotate 的更多信息
终端仪表盘
- 监控应用程序的资源使用情况。您可以通过以下方式轻松直接地从终端监控内存和 CPU
pm2 monit
配置文件
- 生成配置文件
$ pm2 init simple
- 操作配置文件
# Start all applications pm2 start ecosystem.config.js # Stop all pm2 stop ecosystem.config.js # Restart all pm2 restart ecosystem.config.js # Reload all pm2 reload ecosystem.config.js # Delete all pm2 delete ecosystem.config.js
项目中的配置文件
- 以下的这个配置文件是我在项目中实际使用的,大家有需要的话可以参考
环境变量
env_*
您可以通过选项指定不同的环境变量集module.exports = { apps : [{ name : "app1", script : "./app.js", // PM2 会覆盖当前环境来添加NODE_ENV=development // 默认环境是在env env: { // 可以访问到这个变量 // process.env.PORT = 3000 "PORT": 3000, "NODE_ENV": "development", } // 如果要使用这个环境可以使用 // pm2 start ecosystem.config.js --env production env_production: { NODE_ENV: "production" } }] }
- 现在要在不同环境中的变量之间切换,请指定
--env [env name]
选项pm2 start process.json --env production pm2 restart process.json --env development
重启策略
- 在指定的 CRON 时间重新启动应用程序
- 文件更改时重新启动应用程序
- 当应用程序达到内存阈值时重新启动
- 延迟启动和自动重启
- 默认情况下在崩溃或退出时禁用自动重启(应用程序始终使用 PM2 重启)
- 在特定的指数增长时间自动重启应用程序
- 在指定的 CRON 时间重新启动应用程序
module.exports = { apps : [{ name: 'elm_node', script: 'ENABLE_NODE_LOG=YES node index.js', // 将出现在您的应用程序中的环境变量 env: { NODE_ENV: 'development' }, // 注入当做 pm2 restart app.yml --env env_production: { NODE_ENV: 'production' }, // 监视更改 watch: ["app.js", "ecosystem.config.js", "prototype", "config", "elmConfig.json", "middlewares", "controller", "index.js", "models", "mongodb", "routes"], // 指定监视间隔之间的延迟 watch_delay: 1000, // 忽略的文件夹 ignore_watch: ["node_modules", "logs", "yarn.lock", "public", "package.json", "README.md", "COPYING", "InitData", "package-lock.json"] }], };
- 基于内存的重启策略
如果发现请求完成之后内存并没有下来,闲置了几分钟后内存还没有下降,就说明内存一直没有释放,需要手动重启,释放内存
module.exports = { apps : [{ name: 'elm_node', script: 'ENABLE_NODE_LOG=YES node index.js', env: { NODE_ENV: 'development' }, env_production: { NODE_ENV: 'production' }, // 监视更改 watch: ["app.js", "ecosystem.config.js", "prototype", "config", "elmConfig.json", "middlewares", "controller", "index.js", "models", "mongodb", "routes"], // 指定监视间隔之间的延迟 watch_delay: 1000, // 忽略的文件夹 ignore_watch: ["node_modules", "logs", "yarn.lock", "public", "package.json", "README.md", "COPYING", "InitData", "package-lock.json"] // 内存使用超过 300M 重启 max_memory_restart: '300M' }], };
- 完整配置
module.exports = { apps : [{ name: 'elm_node', script: 'ENABLE_NODE_LOG=YES node index.js', env: { NODE_ENV: 'development' }, env_production: { NODE_ENV: 'production' }, watch: ["app.js", "ecosystem.config.js", "prototype", "config", "elmConfig.json", "middlewares", "controller", "index.js", "models", "mongodb", "routes"], watch_delay: 1000, ignore_watch: ["node_modules", "logs", "yarn.lock", "public", "package.json", "README.md", "COPYING", "InitData", "package-lock.json"], max_memory_restart: '300M', restart_delay: 3000, exp_backoff_restart_delay: 100 }] };
日志
- 配置
module.exports = { apps : [{ name: 'elm_node', script: 'ENABLE_NODE_LOG=YES node index.js', env: { NODE_ENV: 'development' }, env_production: { NODE_ENV: 'production' }, // 重启策略 watch: ["app.js", "ecosystem.config.js", "prototype", "config", "elmConfig.json", "middlewares", "controller", "index.js", "models", "mongodb", "routes"], watch_delay: 1000, ignore_watch: ["node_modules", "logs", "yarn.lock", "public", "package.json", "README.md", "COPYING", "InitData", "package-lock.json"], max_memory_restart: '300M', exp_backoff_restart_delay: 100, // 日志 error_file: '/myproject/real_project/ELM_Node/logs/pm2/ELMerr.log', out_file: '/myproject/real_project/ELM_Node/logs/pm2/ELMout.log', pid_file: '/myproject/real_project/ELM_Node/logs/pm2/app-pm_id.pid', log_date_format: 'YYYY-MM-DD HH:mm Z' }] };
集群模式
- 配置
module.exports = { apps : [{ name: 'elm_node', script: 'ENABLE_NODE_LOG=YES node index.js', env: { NODE_ENV: 'development' }, env_production: { NODE_ENV: 'production' }, // 重启策略 watch: ["app.js", "ecosystem.config.js", "prototype", "config", "elmConfig.json", "middlewares", "controller", "index.js", "models", "mongodb", "routes"], watch_delay: 1000, ignore_watch: ["node_modules", "logs", "yarn.lock", "public", "package.json", "README.md", "COPYING", "InitData", "package-lock.json"], max_memory_restart: '300M', exp_backoff_restart_delay: 100, // 日志 error_file: '/myproject/real_project/ELM_Node/logs/pm2/ELMerr.log', out_file: '/myproject/real_project/ELM_Node/logs/pm2/ELMout.log', pid_file: '/myproject/real_project/ELM_Node/logs/pm2/app-pm_id.pid', log_date_format: 'YYYY-MM-DD HH:mm Z', // max意味着 PM2 将自动检测可用 CPU 的数量并运行尽可能多的进程 instances : "max" }] };
优雅的启动/停止
- 优雅的停止
在数据库连接的文件中加入这句话
应用程序退出之前拦截SIGINT信号并清除所需的一切process.on('SIGINT', function() { db.stop(function(err) { process.exit(err ? 1 : 0) }) })
- 配置终止超时
module.exports = { apps : [{ name: 'app', script: './app.js', kill_timeout : 3000 }] }
- 优雅的开始
在应用程序准备好之后发送ready
信号var http = require('http') var app = http.createServer(function(req, res) { res.writeHead(200) res.end('hey') }) var listener = app.listen(0, function() { console.log('Listening on port ' + listener.address().port) // Here we send the ready signal to PM2 process.send('ready') })
- 配置接收ready信号和就绪超时
module.exports = { apps : [{ name: 'app', script: './app.js', wait_ready: true, listen_timeout: 10000 }] }