当前位置: 首页 > news >正文

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

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

    • 1. 前言
    • 2. 官方说明
    • 3. 安装PM2
    • 4. PM2常用命令
      • 4.1 启动命令
      • 4.2 重新启动命令
      • 4.3 热重载命令
      • 4.4 停止命令
      • 4.5 删除命令
      • 4.6 查看进程运行状态
      • 4.4 显示某一个进程的具体信息
      • 4.8 显示日志信息
      • 4.9 终端监控器
      • 4.10 开机自启动
      • 4.11 综合命令
    • 5. PM2配置文件
    • 6. PM2 API方式接入(可选)
    • 7. 总结

面向读者群体

  • ❤️ 电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识 ❤️
  • ❤️ 业余爱好物联网开发者,有简单技术基础,想针对硬件功能构造简单的服务器❤️
  • ❤️ 本篇创建记录 2023-03-12 ❤️
  • ❤️ 本篇更新记录 2023-03-12 ❤️

技术要求

  • 有HTML、CSS、JavaScript基础更好,当然也没事,就直接运行实例代码学习

专栏介绍

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

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

1. 前言

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

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

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

2. 官方说明

  • PM2官方英文说明

在这里插入图片描述
保证你的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 <app_name> 自定义一个应用名称。查看应用信息的时候可以用到。
  • -o --output <path> 标准输出日志文件的路径。建议不改
  • -e --error <path>错误输出日志文件的路径。建议不改

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

# 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

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

apps:- script : index.jsname : 'app'watch: true

执行命令:

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系统上执行这个命令行是有问题的,使用其他库生成自启动脚本。

  • pm2-windows-service
  • pm2-windows-startup

输入命令行:
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# Listingpm2 list               # Display all processes status
pm2 jlist              # Print process list in raw JSON
pm2 prettylist         # Print process list in beautified JSONpm2 describe 0         # Display all information about a specific processpm2 monit              # Monitor all processes# Logspm2 logs [--raw]       # Display all processes logs in streaming
pm2 flush              # Empty all log files
pm2 reloadLogs         # Reload all logs# Actionspm2 stop all           # Stop all processes
pm2 restart all        # Restart all processespm2 reload all         # Will 0s downtime reload (for NETWORKED apps)pm2 stop 0             # Stop specific process id
pm2 restart 0          # Restart specific process idpm2 delete 0           # Will remove process from pm2 list
pm2 delete all         # Will remove all processes from pm2 list# Miscpm2 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

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

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"}]
}

这里就定义应用名字,和执行脚本的启动文件(和我们上面通过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

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

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 PM2pm2.disconnect()})})})
})

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

7. 总结

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

相关文章:

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

【NodeJs-5天学习】第四天存储篇⑤ ——PM2&#xff0c;node.js应用进程管理器1. 前言2. 官方说明3. 安装PM24. PM2常用命令4.1 启动命令4.2 重新启动命令4.3 热重载命令4.4 停止命令4.5 删除命令4.6 查看进程运行状态4.4 显示某一个进程的具体信息4.8 显示日志信息4.9 终端监控…...

【C++学习】【STL】deque容器

dequeDouble Ended Queues(双向队列)deque和vector很相似&#xff0c;但是它允许在容器头部快速插入和删除&#xff08;就像在尾部一样&#xff09;。所耗费的时间复杂度也为常数阶O(1)。并且更重要的一点是&#xff0c;deque 容器中存储元素并不能保证所有元素都存储到连续的内…...

当 App 有了系统权限,真的可以为所欲为?

看到群里发了两篇文章&#xff0c;出于好奇&#xff0c;想看看这些个 App 在利用系统漏洞获取系统权限之后&#xff0c;都干了什么事&#xff0c;于是就有了这篇文章。由于准备仓促&#xff0c;有些 Code 没有仔细看&#xff0c;感兴趣的同学可以自己去研究研究&#xff0c;多多…...

vue3.js的介绍

一.vue.js简述 Vue是一套用于构建用户开源的MVVM结构的Javascript渐进式框架&#xff0c;尤雨溪在2015年10月27日发布了vue.js 1.0Eavangelion版本&#xff0c;在2016年9月30日发布了2.0Ghost in the Shell版本&#xff0c;目前项目由官方负责 vue的核心只关注图层&#xff0…...

【Three.js】shader特效 能量盾

shader特效之能量盾前言效果噪点图主要代码index.htmldepth-fs.jsdepth-vs.jsshield-fs.jsshield-vs.js相关项目前言 效果噪点图 为了可以自定义能量球的效果&#xff0c;这里使用外部加载来的噪点图做纹理&#xff0c;省去用代码写特效的过程。 主要代码 index.html <…...

【6000字长文】需求评审总是被怼?强烈推荐你试试这三招

前段时间和一个合作部门的产品新人沟通需求,结束的时候,他问了我一个问题,“你在产品新人阶段,最害怕做的事情是什么”? 我不假思索的回答说,“需求评审,是曾经最不想面对的环节,甚至在评审之前几个小时就开始心跳加速了。当然这也是产品修炼路上的必经之路,其实只要掌…...

Hive介绍及DDL

1.OLTP和OLAP OLTP&#xff1a; 联机事务处理系统。在前台接收的用户数据可以立即传送到后台进行处理&#xff0c;并在很短的时间内给出处理结果。关系型数据库是OLTP典型应用&#xff0c;如MySQL OLTP环境开展数据分析是否可行&#xff1f; 为了更好的开展数据分析&#x…...

Simulink 自动代码生成电机控制:在某国产ARM0定点MCU上实现自动代码生成无感电机控制

目录 前言 开发流程 定点化的技巧 代码生成运行演示 总结 前言 这次尝试了在国产arm0内核的MCU上实现Simulink自动代码生成永磁同步电机无传感控制。机缘巧合之下拿到了一块国产MCU的电机控制板和一个5000RPM的小电机。最后实现了无传感控制&#xff0c;在这里总结下一些经…...

MySQL基本查询

文章目录表的增删查改Create&#xff08;创建&#xff09;单行数据 全列插入多行数据 指定列插入插入否则更新替换Retrieve&#xff08;读取&#xff09;SELECT列全列查询指定列查询查询字段为表达式查询结果指定别名结果去重WHERE 条件基本比较BETWEEN AND 条件连接OR 条件连…...

你需要知道的 7 个 Vue3 技巧

VNode 钩子在每个组件或html标签上&#xff0c;我们可以使用一些特殊的&#xff08;文档没写的&#xff09;钩子作为事件监听器。这些钩子有&#xff1a;onVnodeBeforeMountonVnodeMountedonVnodeBeforeUpdateonVnodeUpdatedonVnodeBeforeUnmountonVnodeUnmounted我主要是在组件…...

行政区划获取

行政区划获取一、导入jar包二、代码展示背景&#xff1a;公司的行政区划代码有问题&#xff0c;有的没有街道信息&#xff0c;有的关联信息有误&#xff0c;然后找到了国家的网站国家统计局-行政区划&#xff0c;这个里面是包含了所有的行政信息&#xff0c;但是全是html页面&a…...

让ChatGPT介绍一下ChatGPT

申请新必应内测通过了&#xff0c;我在New Bing中使用下ChatGPT&#xff0c;让ChatGPT介绍一下ChatGPT 问题1&#xff1a;帮我生成一篇介绍chatGPT的文章&#xff0c;不少于2000字 回答&#xff1a; chatGPT是什么&#xff1f;它有什么特点和用途&#xff1f; chatGPT是一种…...

【Redis】Redis 主从复制 + 读写分离

Redis 主从复制 读写分离1. Redis 主从复制 读写分离介绍1.1 从数据持久化到服务高可用1.2 主从复制1.3 如何保证主从数据一致性&#xff1f;1.4 为何采用读写分离模式&#xff1f;2. 一主两从环境准备2.1 配置文件2.2 启动 Redis3. 主从复制原理3.1 全量同步3.1.1 建立连接3…...

2023届秋招,鬼知道我经历了什么

仅记录个人经历&#xff0c;充满主观感受&#xff0c;甚至纯属虚构&#xff0c;仅供参考&#xff0c;杠就是你对 本想毕业再写&#xff0c;但是考虑到等毕业了&#xff0c;24秋招的提前批就快开始了&#xff0c;大概就来不及了&#xff0c;正好现在有点时间&#xff0c;陆陆续…...

ChatGPT助力校招----面试问题分享(一)

1 ChatGPT每日一题&#xff1a;期望薪资是多少 问题&#xff1a;面试官问期望薪资是多少&#xff0c;如何回答 ChatGPT&#xff1a;当面试官问及期望薪资时&#xff0c;以下是一些建议的回答方法&#xff1a; 1、调查市场行情&#xff1a;在回答之前&#xff0c;可以先调查一…...

CSS媒体查询@media (prefers-color-scheme:dark)判断系统白天黑夜模式

前言 在最近学习中突然看到了在媒体查询中prefers-color-scheme:dark监听的使用&#xff0c;然后就模仿里边写了个简单例子&#xff0c;代码如下&#xff1a; body {background-color: #f5f5f5;}media (prefers-color-scheme: dark) {body {background-color: #666;}}然后通过…...

运行YOLOv8实现识别

https://github.com/ultralytics/ultralyticshttps://docs.ultralytics.com/环境配置官方环境要求Python>3.7&#xff08;我是python3.8也是可以用的&#xff09; environment with PyTorch>1.7.这是ultralyticsCommand Line Interface命令行接口运行输入参数的格式yolo …...

如何在Linux中优雅的使用 head 命令,用来看日志简直溜的不行

当您在 Linux 的命令行上工作时&#xff0c;有时希望快速查看文件的第一行&#xff0c;例如&#xff0c;有个日志文件不断更新&#xff0c;希望每次都查看日志文件的前 10 行。很多朋友使用文本编辑的命令是vim&#xff0c;但还有个命令head也可以让轻松查看文件的第一行。 在…...

Nginx.conf 配置详解

#安全问题&#xff0c;建议用nobody,不要用root. #user nobody; #worker数和服务器的cpu数相等是最为适宜 worker_processes 2; #work绑定cpu(4 work绑定4cpu) worker_cpu_affinity 0001 0010 0100 1000 #error_log path(存放路径) level(日志等级) path表示日志路径&…...

剖析NLP历史,看chatGPT的发展

1、NLP历史演进 1.1 NLP有监督范式 ​ NLP里的有监督任务的范式&#xff0c;可以归纳成如下的样子。 输入是字词序列&#xff0c;中间一步关键的是语义表征&#xff0c;有了语义表征之后&#xff0c;然后交给下游的模型学习。所以预训练技术的发展&#xff0c;都是在围绕怎么…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...