首页 > 系统相关 >[nodejs] pm2 : nodejs 的进程管理工具

[nodejs] pm2 : nodejs 的进程管理工具

时间:2024-03-23 18:00:53浏览次数:25  
标签:pm2 PM2 nodejs app 管理工具 应用程序 进程 test

0 pm2 概述

0.1 序

0.2 pm2 简述

  • PM2 是一款非常优秀的 Node 进程管理工具,它有着丰富的特性:能够充分利用多核 CPU且能够负载均衡、能够帮助应用在崩溃后、指定时间(cluster model)和超出最大内存限制等情况下实现自动重启
  • PM2 是开源的基于 Nodejs应用进程管理器,包括守护进程,监控,日志的一整套完整的功能

PM2 是一个带有负载均衡功能的 Node 应用进程管理器

0.3 pm2的主要特性

  • 内建负载均衡(使用 Node cluster 集群模块)
  • 后台运行
  • 0 秒停机重载,我理解大概意思是维护升级的时候不需要停机.
  • 具有 Ubuntu 和 CentOS 的启动脚本
  • 停止不稳定的进程(避免无限循环)
  • 控制台检测
  • 提供 HTTP API
  • 远程控制和实时的接口 API(Nodejs 模块,允许和 PM2 进程管理器交互)

1 pm2的安装

Step1 安装nodejs/npm

  • 在使用pm2之前,我们还需要安装nodejs/npm,这是前提

下载nodejs:

如何安装nodejs?

Step2 基于npm安装pm2

  • 安装pm2
# 全局安装 pm2
npm install pm2 -g

npm install 
  • 查看版本
pm2 -v
或 pm2 --version
  • 补充:基于yarn安装pm2
yarn global add pm2

2 pm2的常用命令

启动/停止/重启/重置/重载/删除

  • 启动
# 启动进程/应用 
pm2 start app.js
或 pm2 start bin/www 
或 pm2 start app.js --name my-app
或 pm2 start app.js -i 4 
    # 根据CPU核数启动进程个数。
    # cluster mode 模式启动4个app.js的应用实例,4个应用程序会自动进行负载均衡
或 pm2 start app.js --watch 
    # 实时监控app.js的方式启动。当app.js文件有变动时,pm2会自动reload


# 重命名进程/应用 
pm2 start app.js --name wb123

# 添加进程/应用 
pm2 start bin/www --watch
  • 停止
# 结束进程/应用 
pm2 stop www

# 结束所有进程/应用 
pm2 stop all
# 停止PM2列表中进程为0的进程
pm2 stop 0
  • 重载/重启
# 重载PM2列表中cluster mode下所有的进程
pm2 reload all 
# 重载PM2列表中进程为0的进程
pm2 reload 0

# 重新启动所有进程/应用 
pm2 restart all
# 重新启动指定的进程/应用 
pm2 restart www
pm2 restart 0

# 重置重启
// Graceful reload all apps in cluster mode
pm2 gracefulReload all 
pm2 reset [app-name]
  • 删除应用/进程
# 删除所有进程/应用 
pm2 delete all
# 删除指定的进程/应用 
pm2 delete www
pm2 delete 0

查看/监控/日志

  • 查看/列出应用/进程
# 列出所有进程/应用 
pm2 list

# 显示应用程序的所有信息
pm2 show [app-name] 
或 pm2 show 0
# 查看进程详细信息,0为PM2进程id
pm2 info 0 

# 查看某个进程/应用具体情况 
pm2 describe www
  • 监控应用/进程
# 查看进程/应用的资源消耗情况 (显示每个应用程序的CPU和内存占用情况)
pm2 monit
  • 日志操作
pm2 logs # 显示所有应用程序的日志
pm2 logs [app-name] # 显示指定应用程序的日志
    # 例如:若要查看某个进程/应用的日志 : pm2 logs www

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

系统级/远程操作/安装/卸载/其他

  • 系统级命令
pm2 startup # 创建开机自启动命令
pm2 save # 保存当前应用列表
pm2 resurrect # 重新加载保存的应用列表
pm2 update # Save processes, kill PM2 and restore processes
pm2 generate # Generate a sample json configuration file
  • 远程操作
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
  • 安装/升级/卸载
npm install pm2@lastest -g # 安装最新的PM2版本
pm2 updatePM2 # 升级pm2
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
  • 其他命令
pm2 start script.sh # 启动 bash 脚本
pm2 scale api 10 # 把名字叫api的应用扩展到10个实例
pm2 reset [app-name] # 重置重启数量
  • 更多 、帮助
pm2 --help

3 PM2目录结构

默认的目录是:当前用于的HOME目录下的.pm2目录(此目录可以自定义),详细信息如下:

$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

4 自定义PM2启动文件

创建一个test.json的示例文件,格式如下:

~]# mkdir -p /opt/htdocs/testapp
~]# cd /opt/htdocs/testapp
testapp]# cat test.json
{
    "apps": [
        {
            "name": "test",
            //"port": "8003", // 启动端口
            "cwd": "/opt/htdocs/testapp",
            "script": "./test.sh",
            "exec_interpreter": "bash",
            "log_date_format": "YYYY-MM-DD HH:mm Z",
            "error_file": "./test-err.log",
            "out_file": "./test-out.log",
            "pid_file": "./test.pid",
            "instances": 6,
            "min_uptime": "200s",
            "max_restarts": 10,
            "max_memory_restart": "1M",
            "cron_restart": "1 0 * * *",
            "watch": false,
            "merge_logs": true,
            "exec_mode": "fork",
            "autorestart": false,
            "vizion": false
        }
    ]
}

参数说明:

apps:json结构,apps是一个数组,每一个数组成员就是对应一个pm2中运行的应用
name:应用程序名称
cwd:应用程序所在的目录
script:应用程序的脚本路径
log_date_format:配置日志的输出格式
error_file:自定义应用程序的错误日志文件六、实例展示
out_file:自定义应用程序日志文件已上面的test.json为例
pid_file:自定义应用程序的pid文件
instances:启动脚本相 默认 nodejs
min_uptime:最小运行时间,这里设置的是60s即如果应用程序在60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量
max_restarts:设置应用程序异常退出重启的次数,默认15次(从0开始计数
cron_restart:定时启动,解决重启能解决的问题
watch:是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件。done
merge_logs:combine_logs的别名
exec_interpreter:应用程序的脚本类型,这里使用的shell,默认是nodejs
exec_mode:应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork
autorestart:启用/禁用应用程序崩溃或退出时自动重启
vizion:启用/禁用vizion特性(版本控制)

执行如下命令:

testapp]# pm2 start test.json 
[PM2][WARN] You are starting 6 processes in fork_mode without load balancing. To enable it remove -x option.
[PM2][WARN] Applications test not running, starting...
[PM2] cron restart at 1 0 * * *
[PM2] App [test] launched (6 instances)
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬──────────┬──────┬──────────┐
│ App name │ id │ mode │ pid  │ status │ restart │ uptime │ cpu │ mem      │ user │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼──────────┼──────┼──────────┤
│ test     │ 0  │ fork │ 2194 │ online │ 0       │ 0s     │ 0%  │ 1.4 MB   │ root │ disabled │
│ test     │ 1  │ fork │ 2196 │ online │ 0       │ 0s     │ 0%  │ 1.4 MB   │ root │ disabled │
│ test     │ 2  │ fork │ 2198 │ online │ 0       │ 0s     │ 0%  │ 1.4 MB   │ root │ disabled │
│ test     │ 3  │ fork │ 2200 │ online │ 0       │ 0s     │ 0%  │ 1.4 MB   │ root │ disabled │
│ test     │ 4  │ fork │ 2202 │ online │ 0       │ 0s     │ 0%  │ 1.4 MB   │ root │ disabled │
│ test     │ 5  │ fork │ 2204 │ online │ 0       │ 0s     │ 0%  │ 1.4 MB   │ root │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴──────────┴──────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app


[root@bogon testapp]# pm2 list
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬──────────┬──────┬──────────┐
│ App name │ id │ mode │ pid  │ status │ restart │ uptime │ cpu │ mem      │ user │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼──────────┼──────┼──────────┤
│ test     │ 0  │ fork │ 2221 │ online │ 1       │ 5s     │ 0%  │ 1.4 MB   │ root │ disabled │
│ test     │ 1  │ fork │ 2225 │ online │ 1       │ 5s     │ 0%  │ 1.4 MB   │ root │ disabled │
│ test     │ 2  │ fork │ 2229 │ online │ 1       │ 5s     │ 0%  │ 1.4 MB   │ root │ disabled │
│ test     │ 3  │ fork │ 2233 │ online │ 1       │ 5s     │ 0%  │ 1.4 MB   │ root │ disabled │
│ test     │ 4  │ fork │ 2237 │ online │ 1       │ 4s     │ 0%  │ 1.4 MB   │ root │ disabled │
│ test     │ 5  │ fork │ 2241 │ online │ 1       │ 4s     │ 0%  │ 1.4 MB   │ root │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴──────────┴──────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app


testapp]# pm2 delete all
[PM2] Applying action deleteProcessId on app [all](ids: 0,1,2,3,4,5)
[PM2] [test](3) ✓
[PM2] [test](1) ✓
[PM2] [test](0) ✓
[PM2] [test](2) ✓
[PM2] [test](4) ✓
[PM2] [test](5) ✓
┌──────────┬────┬──────┬─────┬────────┬─────────┬────────┬─────┬─────┬──────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
└──────────┴────┴──────┴─────┴────────┴─────────┴────────┴─────┴─────┴──────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app
[root@bogon testapp]# pm2 list      
┌──────────┬────┬──────┬─────┬────────┬─────────┬────────┬─────┬─────┬──────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
└──────────┴────┴──────┴─────┴────────┴─────────┴────────┴─────┴─────┴──────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app

X 参考与推荐文献

标签:pm2,PM2,nodejs,app,管理工具,应用程序,进程,test
From: https://www.cnblogs.com/johnnyzen/p/18091142

相关文章

  • [nodejs] nodejs版本管理工具:nvm
    0序言nodejs的版本管理、安装,是个麻烦事儿。例如在centos7上安装nodejs,就不是那么痛快。(基于docker的安装,除外)1nvm简述nvm是一个node的版本管理工具,可以简单操作node版本的切换、安装、查看等与npm不同的是:npm是依赖包的管理工具,nvm是nodejs的版本管理工具,通过它可以......
  • 2种包管理工具:pip和pipenv
    一、pippip 是Python的包安装器,它用于安装和管理Python包,它通过requirements.txt文件来管理项目所依赖的包1、生成requirements.txt文件:pipfreeze>requirements.txt2、安装requirements.txt依赖:pipinstall-rrequirements.txt3、激活虚拟环境:sourcemyenv/bin/activ......
  • 2020-2-20-nodejs基础知识
    vs插件安装、快速运行、url模块使用、自动重启工具supervisor、自定义模块、下载第三方包、fs模块、Async、Await的使用、文件里、简易静态服务器、事件驱动EventEmitter、模拟登陆简单版、模拟express封装、操作mongodb数据库VScode插件安装需要安装NodeSnippets插件才会有提......
  • Nodejs常用命令及解释
    node-启动Node.js程序解释:使用该命令可以直接运行一个Node.js程序,从而执行其中的JavaScript代码。npm-Node.js包管理器命令解释:npm是Node.js的包管理器,可以用来安装、卸载和管理Node.js包。常用的命令有:npminit-初始化一个新的Node.js项目npminsta......
  • nodejs 实现 AMD 加载 依赖
    importfsfrom"fs";importpathfrom"path";importvmfrom"vm";exportclassLoadComponent{componentsPath:string=path.resolve("../first/components/");componentName:string="";componentIn......
  • pinia——vue3的状态管理工具
    简介Pinia是Vue的专属状态管理库,它允许你跨组件或页面共享状态。主要优点Vue2和Vue3都支持,这让我们同时使用Vue2和Vue3的小伙伴都能很快上手。pinia中只有state、getter、action,抛弃了Vuex中的Mutation,Vuex中mutation一直都不太受小伙伴们的待见,pinia直接抛弃它了,这无疑......
  • 九连冠!禅道再获2023年「常用测试管理工具」第一名
    近期,软件测试网(51Testing)发布了2023年第17届《2023软件测试行业现状调查报告》。 报告数据显示,禅道项目管理软件凭借41.5%的企业使用占比,以压倒性的优势稳居「2023公司常用测试管理工具」榜首。与2022年禅道36.5%的企业使用率相比,2023年禅道的使用率同比增长了5%,呈逐年上升趋势......
  • 4.零基础Nodejs快速入门——Node.js 模块化
    Node.js模块化一、介绍1.1什么是模块化与模块?将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为模块化其中拆分出的每个文件就是一个模块,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用1.2什么是模块化项目?......
  • 6.零基础Nodejs快速入门——包管理工具
    包管理工具一、概念介绍1.1包是什么『包』英文单词是package,代表了一组特定功能的源码集合1.2包管理工具管理『包』的应用软件,可以对「包」进行下载安装,更新,删除,上传等操作借助包管理工具,可以快速开发项目,提升开发效率包管理工......
  • 【NodeJS】GLIBC_2.28 not found CentOS7不兼容Node高版本 npm报错
    CentOS7环境下安装Nvm,在执行nvmuse18.17.0后执行node-v爆出如下错误 bash复制代码node:/lib64/libm.so.6:version`GLIBC_2.27'notfound(requiredbynode)node:/lib64/libc.so.6:version`GLIBC_2.25'notfound(requiredbynode)node:/lib64/libc.so......