• 【NodeJs-5天学习】第四天存储篇⑤ ——PM2,node.js应用进程管理器


    面向读者群体

    • ❤️ 电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识 ❤️
    • ❤️ 业余爱好物联网开发者,有简单技术基础,想针对硬件功能构造简单的服务器❤️

    技术要求

    • HTMLCSSJavaScript基础更好,当然也没事,就直接运行实例代码学习

    专栏介绍

    • 通过简短5天时间的渐进式学习NodeJs,可以了解到基本的服务开发概念,同时可以学习到npm、内置核心API(FS文件系统操作、HTTP服务器、Express框架等等),最终能够完成基本的web开发,而且能够部署到公网访问。

    学习交流群

    • NodeJs物联网五天入门学习之旅(搜索:729040020

    🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝

    1. 前言

    之前很多情况下我们启动nodejs项目都是通过node命令去启动,但是这种方式一般也不是很稳定安全(如果直接通过node app来启动,如果报错了可能直接停在整个运行)。这时候就需要一个node进程管理工具(也叫作应用管理,像我们之前用的nodemon,更偏向于用于开发中服务热加载),可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等。

    这就是我们本篇需要介绍到的PM2管理器。

    在部署 【ESP 保姆级教程】疯狂Node.js服务器篇 ——nodejs应用部署到腾讯云,实现公网访问 中,我们就涉及到PM2的使用。

    2. 官方说明

    在这里插入图片描述
    保证你的NodeJS程序 24小时正常运行。

    3. 安装PM2

    cmd上面输入命令:

    npm install pm2 -g

    在这里插入图片描述
    这时候我们就可以用PM2来接管原来的node启动命令了。这里我们随便启动一个原有的NodeJs项目:
    在这里插入图片描述
    pm2安装好后,会自动创建下面目录。
    在这里插入图片描述
    核心几个目录文件信息:

    • logs 包含所有管理中的NodeJs应用的日志信息(这样就方便我们可以看到对应应用的日志信息,方便排查问题)
      在这里插入图片描述
      在这里插入图片描述

    • pids 包含所有应用的进程id
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      通过cmd命令qprocess PID编号(这里是qprocess 19292) 查看一下:
      在这里插入图片描述
      信息能对上。

    • pm2.log 这里是PM2管理器自己本身的日志信息
      在这里插入图片描述

    • pm2.pid 这里是PM2管理器自己本身的进程ID

    在这里插入图片描述
    在这里插入图片描述

    4. PM2常用命令

    PM2命令不多,我们来了解一些比较有用的。

    4.1 启动命令

    最基本的启动命令:

    pm2 start app.js

    也可以加上一些参数,包括:

    • --watch 监听应用目录的变化,一旦发生变化,自动重启。
    • --ignore-watch 排除监听的目录/文件,可以是特定的文件名,也可以是正则。比如 pm2 start env.js --watch --ignore-watch="node_modules" 不监听node_modules目录变化。
    • --name 自定义一个应用名称。查看应用信息的时候可以用到。
    • -o --output 标准输出日志文件的路径。建议不改
    • -e --error 错误输出日志文件的路径。建议不改

    完整命令行参数:直接查看官方文档

    # Specify an app name
    --name <app_name>
    
    # Watch and Restart app when files change
    --watch
    
    # Set memory threshold for app reload
    --max-memory-restart <200MB>
    
    # Specify log file
    --log <log_path>
    
    # Pass extra arguments to the script
    -- arg1 arg2 arg3
    
    # Delay between automatic restarts
    --restart-delay <delay in ms>
    
    # Prefix logs with time
    --time
    
    # Do not auto restart app
    --no-autorestart
    
    # Specify cron for forced restart
    --cron <cron_pattern>
    
    # Attach to application log
    --no-daemon
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    另外,也可以通过配置yml文件启动。在项目根目录创建一个yml文件:
    在这里插入图片描述
    输入内容:

    apps:
      - script : index.js
        name : 'app'
        watch: true
    
    • 1
    • 2
    • 3
    • 4

    执行命令:

    pm2 start app.yml
    在这里插入图片描述

    4.2 重新启动命令

    pm2 restart app_name

    这里重启一下我们上面刚刚打开的应用,它的名字使用了默认,是index
    在这里插入图片描述

    注意,这个命令只会重启在PM2管理记录里面的应用。如果通过delete命令去操作无法重启成功。

    4.3 热重载命令

    pm2 reload app_name

    这里热重载一下我们上面刚刚打开的应用,它的名字使用了默认,是index
    在这里插入图片描述

    注意,这个命令只会热重载在PM2管理记录里面的应用。如果通过delete命令去操作无法重启成功。

    4.4 停止命令

    停止特定的应用。可以先通过pm2 list获取应用的名字(–name指定的)或者进程id

    • pm2 stop app_name|app_id

    停止所有的应用。

    • pm2 stop all

    这里我们分别停止单个应用,它的名字使用了默认,是index 以及停止全部应用。
    在这里插入图片描述

    4.5 删除命令

    删除特定的应用。可以先通过pm2 list获取应用的名字(–name指定的)或者进程id

    • pm2 delete app_name|app_id

    停止所有的应用。

    • pm2 delete all

    在这里插入图片描述
    在这里插入图片描述

    对比停止命令,删除命令更加彻底,直接连记录也删除了。

    4.6 查看进程运行状态

    • pm2 [list|ls|status]

    在这里插入图片描述

    4.4 显示某一个进程的具体信息

    • pm2 describe app_id

    在这里插入图片描述

    4.8 显示日志信息

    • pm2 logs [–lines n]

    在这里插入图片描述

    4.9 终端监控器

    • pm2 monit

    在这里插入图片描述

    4.10 开机自启动

    • 保存当前进程状态

    pm2 save
    在这里插入图片描述

    • 生成开机自启动脚本

    pm2 startup
    在这里插入图片描述
    在win系统上执行这个命令行是有问题的,使用其他库生成自启动脚本。

    输入命令行:
    npm install pm2-windows-startup -g
    在这里插入图片描述
    输入命令行:
    pm2-startup install
    在这里插入图片描述

    pm2 将在启动时恢复已保存的进程

    • 移除启动脚本

    pm2 unstartup(window系统用pm2-startup uninstall )
    在这里插入图片描述

    4.11 综合命令

    # 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 information 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    这些命令都可以输入到命令行看看效果。

    5. PM2配置文件

    以上我们都是通过命令行一句句输入,那么肯定会考虑如果有一个配置文件直接执行会不会更好。这就用到了ecosystem.config.js:文件。

    官方文档参考:https://pm2.keymetrics.io/docs/usage/application-declaration/

    输入命令

    pm2 init simple

    会在当前项目根目录下生成一个 ecosystem.config.js 文件。

    在这里插入图片描述

    module.exports = {
      apps : [{
        name   : "app1",
        script : "./index.js"
      }]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这里就定义应用名字,和执行脚本的启动文件(和我们上面通过yml文件启动配置一样)。接下来就可以用以下命令代替原先的一些操作命令。

    # 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    注意,这里可以和命令行对比。

    6. PM2 API方式接入(可选)

    上面说的都是通过命令行接入,实际上PM2也支持以NodeJS项目 api的方式接入。喜欢的朋友可以创建一个类似于PM2管理者角色的项目来维护所有项目状态。

    参考官方文档:pm2-doc-single-page

    const pm2 = require('pm2')
    
    pm2.connect(function(err) {
      if (err) {
        console.error(err)
        process.exit(2)
      }
    
      pm2.start({
        script    : 'api.js',
        name      : 'api'
      }, function(err, apps) {
        if (err) {
          console.error(err)
          return pm2.disconnect()
        }
    
        pm2.list((err, list) => {
          console.log(err, list)
    
          pm2.restart('api', (err, proc) => {
            // Disconnects from PM2
            pm2.disconnect()
          })
        })
      })
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    学习的时候我们直接对照命令行来看即可。

    7. 总结

    本篇主要学习一下 PM2这个 node.js应用进程管理工具,特别是针对比较多NodeJS项目运行时,我们如何做到更加合理去管理运行状态。这里只是简单介绍一下,抛砖引玉,深入的学习还请直接阅读官方文档。

  • 相关阅读:
    gin框架中使用websocket发送消息及群聊
    YOLOv3: An Incremental Improvement的译读笔记
    软件架构思想和系统架构图
    redis
    【CodeTop】TOP 100 刷题 11-20
    【运维知识高级篇】超详细的Jenkins教程3(Maven项目上线全流程)
    【Qt开发流程】之富文本处理
    请你谈谈网站是如何进行访问的?【web领域面试题】
    Websocket搭建(Vue+Springboot)
    XTU-OJ 1175-Change
  • 原文地址:https://blog.csdn.net/weixin_44614230/article/details/127357960