PM2 如何进行进程守护和恢复

在 Web 开发的过程中,我们经常会遇到需要管理多个进程的情况,如 Node.js 服务、后台任务等。这时候,PM2 可以成为非常有用的工具,它可以帮助我们进行进程守护和恢复,从而提高应用的稳定性和可用性。

什么是 PM2

PM2 是一个 Node.js 应用程序的生产流程管理工具,它可以管理你的应用程序,保证它们始终保持启动状态,即使存在异常退出也可以相应地重启,同时还能监视你的应用程序,当内存占用过高时进行告警。

PM2 是一个基于 Node.js 的开源项目,完全免费,并且支持跨平台使用,支持 Windows、Linux、MacOS 和公有云运行环境等。

安装和使用 PM2

首先我们需要全局安装 PM2,在命令行中输入以下命令即可:

--- ------- -- ---

安装完成后,我们可以通过以下命令启动一个应用进程:

--- ----- ------

这将在后台启动一个 Node.js 进程,并保证它始终处于运行状态。如果我们不希望 PM2 管理某一个进程,也可以在启动时指定 --no-daemon 参数,即:

--- ----- ------ -----------

这样启动的进程会在前台运行,这在调试代码时可能会更加方便。

如果我们需要查看已经启动的进程,可以使用以下命令:

--- ----

这将列出所有已经启动的进程,包括进程 ID、名称、状态、版本号等信息。

如果我们需要重启某一个进程,可以使用以下命令:

--- ------- ---

这将重启名称为 app 的进程。

除了以上的命令之外,PM2 还支持很多其他的命令,如停止进程、查看日志、设置环境变量等。

进程守护和恢复

PM2 最大的特点之一就是可以进行进程守护和恢复。一旦应用程序出现了异常,PM2 会自动重启应用程序,从而保证应用程序始终处于运行状态。

PM2 的进程守护和恢复依赖于 PM2 自身的监控机制。当 PM2 发现一个进程异常退出时,会根据配置文件中的设置自动重启进程。下面我们来具体了解一下:

配置文件

在使用 PM2 进行进程管理时,我们需要准备一个配置文件(pm2.config.js),并在启动时指定该配置文件。该配置文件是一个 JavaScript 文件,包括一个名为 module.exports 的对象,对象中可以设置一些 PM2 启动时需要的参数,如应用程序的入口文件、应用程序需要使用的环境变量等。例如:

-------------- - -
  ----- --
    ----- --------
    ------- ---------

    -- ------- ---------- -------------------------------------------------------------
    ----- ---- -----
    ---------- --
    ------------ -----
    ------ ------
    ------------------- -----
    ---- -
      --------- ------------
    --
    --------------- -
      --------- ------------
    -
  --
--

上面的配置文件中,apps 数组中包含一个应用程序对象,该对象包括了以下属性:

  • name:应用程序名称
  • script:应用程序入口文件
  • instances:应用程序启动的实例个数,可以设置为 0,表示根据 CPU 核数来启动实例
  • autorestart:当应用程序异常退出时,是否自动重启,默认为 true
  • watch:当文件变化时,是否自动重启,默认为 false
  • max_memory_restart:应用程序占用内存的阈值,超过该阈值时自动重启应用程序
  • env:应用程序所需要的环境变量
  • env_production:生产环境所需要的环境变量

除了以上的属性之外,我们还可以通过 args 参数来为应用程序传递参数,如上面的配置中通过 args: 'one two' 传递了两个参数给应用程序。

进程重启

当应用程序异常退出时,PM2 会根据配置文件中的设置自动重启应用程序。此时,我们可以在 PM2 的日志中查看详细的错误日志,进而进行问题排错。

如果需要手动重启某一个进程,可以使用以下命令:

--- ------- ---

这将重启名称为 app 的进程。

进程监控

PM2 还可以在运行期间监控进程的使用情况,如 CPU 占用率、内存占用率等。如果进程内存占用过高,PM2 可以根据配置文件中的设置来自动进行重启。

我们可以使用以下命令来监控进程:

--- -----

这将打开一个 Web 界面,显示当前所有进程的状态信息,包括 CPU 占用率、内存占用率、事件循环延迟等。

总结

本文介绍了如何使用 PM2 进行进程守护和恢复,包括了 PM2 的安装、使用方法、进程守护和恢复的原理等。希望本文能够对大家有所帮助,在日常的开发中能够更加轻松地管理多个进程。

附:示例代码

以下是一个简单的 Node.js 应用程序代码(app.js):

----- ---- - ----------------

-------------------------- ----- ---- -
  ------------------ ---------------- ---------------
  -------------- ---------
----------------

使用 PM2 启动该应用程序,可以使用以下命令:

--- ----- ------ ------ ----- ------- ----------------------------------------

该命令中有几个参数需要注意:

  • --name:指定应用程序名称为 myapp
  • --watch:当文件变化时,自动重启应用程序
  • --node-args="--inspect-brk=0.0.0.0:9229":开启 Node.js 的调试模式,并监听 9229 端口,这样可以通过 VS Code 进行远程调试

以上命令执行成功后,可以通过以下命令查看进程状态:

--- ----

同时也可以通过浏览器访问 http://localhost:3000 查看应用程序是否正常运行。

如果需要重启应用程序,可以使用以下命令:

--- ------- -----

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64f70dd3f6b2d6eab3f9ca2c


猜你喜欢

  • 如何在 Sequelize 中使用自定义数据验证规则

    如何在 Sequelize 中使用自定义数据验证规则 Sequelize 是一个强大的 Node.js ORM,它提供了许多灵活的功能,例如模型定义、关系映射、数据验证和查询构建等。

    1 年前
  • 与 Vue.js 组件有关的常见问题

    1. 组件之间通信的方式 在 Vue.js 中,组件之间通信的方式主要有三种: 1.1 父子组件通信 通过 props 和 $emit 实现,父组件通过 props 向子组件传递数据,子组件通过 $e...

    1 年前
  • Docker 划重点 | docker-compose.yml 详解

    前言 Docker 是目前比较流行的容器技术之一,可以很方便地构建、部署和运行应用程序,相比于传统的虚拟机技术,Docker 容器更加轻量级,使用 Docker 可以大大提高应用程序的开发和部署效率。

    1 年前
  • Next.js 中如何做 SEO 优化?

    随着搜索引擎越来越重要,SEO(Search Engine Optimization)优化逐渐成为了前端开发中极为关键的一个方面。而在进行 SEO 优化时,Next.js 提供了一系列有利的功能,包括...

    1 年前
  • SSE 中的缓存控制问题及解决方法

    背景 SSE (Server Sent Events) 是一种 Web 技术,它允许服务器向客户端发送实时数据。SSE 基于 HTTP 协议,采用了长连接机制,可以实现服务器向客户端推送数据而无需客户...

    1 年前
  • Cypress 集成在 Jenkins 中的实现方法

    什么是 Cypress Cypress 是一个基于 Web 的自动化测试工具,能够在浏览器中运行,用于测试我们的 Web 应用程序。相较于其他自动化测试工具,Cypress 更加易于使用且速度更快。

    1 年前
  • MongoDB 数据库安全技术和思路

    介绍 随着互联网技术的不断发展,大量数据被存储在数据库中,而随之而来的就是数据库的安全问题。MongoDB 是一个流行的 NoSQL 数据库,它有很多与安全相关的特性和设置。

    1 年前
  • 从 AngularJS 到 Angular 2/4/5 的升级指南

    前言: AngularJS 一度是 web 前端开发中最火热的技术之一,其架构设计和双向数据绑定机制给前端带来了很多便利,让我们的工作效率得到了很大提升。但是随着技术的快速演进和发展,现在的 Angu...

    1 年前
  • Fastify 中的请求验证

    Fastify 是一个高效的 Node.js Web 框架,提供了许多优秀的功能,包括请求验证。在本篇文章中,我们将深入了解请求验证的实现方式,并提供详细的指导和示例代码。

    1 年前
  • 优化异步编程:ES12 中的 Promise.any() 和 Promise.allSettled() 详解

    在 JavaScript 编程中,异步操作是常见的,例如通过网络请求获取数据、定时器等等。在异步编程中,经常使用 Promise 来处理异步请求。ES6 中新增了 Promise.all() 方法,用...

    1 年前
  • ES2016:迭代器实践技巧及其与生成器的关系

    在 JavaScript 中,迭代器是一种特殊的对象,用于遍历集合中的数据。在 ES2016 中,迭代器的概念得到了进一步的扩展和深化,同时与之关联的生成器的概念也被更广泛地应用于实际开发中。

    1 年前
  • PostgreSQL 性能优化:如何利用索引提升查询速度?

    在任何应用程序中,查询性能都是非常重要的因素。优化查询需要大量的经验和技巧。其中,利用索引来提高数据库查询性能是最常见的优化方式之一。PostgreSQL 是一款功能强大而且灵活的关系型数据库管理系统...

    1 年前
  • Koa 项目中使用 MongoDB 数据库遇到的常见问题及解决方法

    在 Koa 项目中,使用 MongoDB 数据库是比较常见的一种方式,但是在使用过程中可能会遇到一些问题。本文将针对这些问题进行讲解,并提供解决方法。同时,我们还将提供示例代码,帮助读者更好地理解和应...

    1 年前
  • ECMAScript 2018 的 Promise 新增 finally 方法的用法解析

    Promise 是 JavaScript 中一个重要的异步编程工具,它已经成为了现代 Web 开发中必不可少的部分。在 ECMAScript 2018 中,Promise 新增了 finally 方法...

    1 年前
  • Webpack 优化实践:使用 dynamic-import 进行懒加载

    在大型的前端项目中,通过 Webpack 进行打包是必不可少的一环,而在 Webpack 打包优化中,使用懒加载技术可以明显降低初始加载时间,提升页面响应速度。在懒加载技术中,dynamic-impo...

    1 年前
  • 解决 Mocha 测试框架中出现的 “TypeError: Cannot read property 'AssertionError' of undefined” 问题

    在使用 Mocha 测试框架时,有时会出现 “TypeError: Cannot read property 'AssertionError' of undefined” 错误,这可能是由于测试用例中...

    1 年前
  • Vue.js 中使用 RxJS 实现响应式数据

    前言 Vue.js 是一款流行的前端框架,其提供了响应式的数据绑定,让我们可以方便地处理数据的变化和渲染更新。而 RxJS 则是一个强大的响应式编程库,可以帮助我们更好地处理异步、事件流等场景。

    1 年前
  • 如何使用 ESLint 整合 Sass 进行代码风格检查

    引言 在前端开发中,代码风格的统一性和可读性非常重要,可以提高代码质量和协作效率,而 ESLint 是目前最流行的代码风格检查工具之一。但是默认情况下,ESLint 只能检查 JS 文件,无法检查 C...

    1 年前
  • ES11 (2020) 中的 nullish 合并运算符:如何有效避免编程中的错误?

    什么是 nullish 合并运算符? 在早期的 JavaScript 版本中,我们经常使用逻辑或 ( || ) 运算符来判定变量是否为真。例如: ----- ------ - - -- --这段代码的...

    1 年前
  • Serverless 架构中的数据存储方案分析

    随着云计算的快速发展,Serverless 架构越来越受到前端开发者的关注。Serverless 架构的优点在于无需考虑服务器管理和弹性伸缩,以更快的速度和更低的成本租用计算资源,从而为前端开发者节省...

    1 年前

相关推荐

    暂无文章