溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Node的進(jìn)程管理工具pm2怎么使用

發(fā)布時(shí)間:2023-04-13 14:32:28 來源:億速云 閱讀:172 作者:iii 欄目:web開發(fā)

本篇內(nèi)容介紹了“Node的進(jìn)程管理工具pm2怎么使用”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

PM2簡(jiǎn)介

PM2是一個(gè)內(nèi)建了負(fù)載均衡器的node進(jìn)程管理工具,可以利用它來簡(jiǎn)化很多node應(yīng)用管理的繁瑣任務(wù),如性能監(jiān)控、自動(dòng)重啟、負(fù)載均衡等,而且使用非常簡(jiǎn)單。當(dāng)你要把你的獨(dú)立代碼利用全部的服務(wù)器上的所有 CPU,并保證進(jìn)程永遠(yuǎn)都活著,0 秒的重載, PM2 是完美的。

為什么需要pm2?

目前Nodejs開發(fā)中有很多痛點(diǎn),因?yàn)閚ode本身是一個(gè)單線程應(yīng)用,它的特點(diǎn)就是所有方法都是串行一次執(zhí)行,并且node并沒有能力像Java一樣獨(dú)自去創(chuàng)建一個(gè)新的線程來實(shí)現(xiàn)異步操作,如果在執(zhí)行I/O中遇到了阻塞就會(huì)降低整個(gè)應(yīng)用的執(zhí)行效率,導(dǎo)致CPU使用率高等不利原因。

因此在這種模式下,一個(gè)線程只能處理一個(gè)任務(wù),要想提高吞吐量必須通過多線程。雖然單線程的好處有很多比如避免了線程同步或者死鎖、狀態(tài)同步等等之類的問題,但是在應(yīng)用和計(jì)算能力要求日益倍增的今天,單線程最大的弊端就是無法利用多核CPU帶來的優(yōu)勢(shì)來提升運(yùn)行效率。pm2可以把你的應(yīng)用部署到服務(wù)器所有的CPU上,有效的解決這個(gè)問題

特性

  • 內(nèi)建負(fù)載均衡(使用Node cluster 集群模塊)

  • 后臺(tái)運(yùn)行

  • 0秒停機(jī)重載(維護(hù)升級(jí)的時(shí)候不需要停機(jī)).

  • 具有Ubuntu和CentOS 的啟動(dòng)腳本

  • 停止不穩(wěn)定的進(jìn)程(避免無限循環(huán))

  • 控制臺(tái)檢測(cè)

  • 提供 HTTP API

  • 遠(yuǎn)程控制和實(shí)時(shí)的接口API ( Nodejs 模塊,允許和PM2進(jìn)程管理器交互 )

安裝

直接使用 npm 進(jìn)行全局安裝即可。當(dāng)然你也可以使用 yarn 來進(jìn)行安裝

// npmnpm install -g pm2
 
// yarnyarn global add pm2

基本命令

// 啟動(dòng)命令
pm2 start app.js // 啟動(dòng)nodeJs應(yīng)用,進(jìn)程的默認(rèn)名稱為文件名app
pm2 start app.js--name mynode // 啟動(dòng)node,并指定進(jìn)程名稱為mynode
pm2 start app.js - i max // 根據(jù)有效CPU數(shù)目啟動(dòng)最大進(jìn)程數(shù)目
pm2 start app.js - i 3 // 啟動(dòng)3個(gè)進(jìn)程
pm2 start app.js--watch // 實(shí)時(shí)監(jiān)控的方式啟動(dòng),app.js文件有變動(dòng)時(shí),pm2會(huì)自動(dòng)reload
pm2 start app.js - x // 用fork模式啟動(dòng) app.js 而不是使用 cluster
pm2 start app.js - x– - a 23 // 用fork模式啟動(dòng) app.js 并且傳遞參數(shù)(-a 23)
pm2 start app.json // 啟動(dòng)進(jìn)程, 在app.json里設(shè)置選項(xiàng)
pm2 start app.js - i max– - a 23 // 在 – 之后給 app.js 傳遞參數(shù)
pm2 start app.js - i max - e err.log - o out.log // 啟動(dòng)并生成一個(gè)配置文件
 
// 查看與監(jiān)視進(jìn)程
pm2 list | pm2 ls // 顯示所有進(jìn)程;
pm2 show 0 | pm2 info 0 // 查看進(jìn)程id為0的詳細(xì)信息
pm2 monit // 進(jìn)入監(jiān)視頁面,監(jiān)視每個(gè)node進(jìn)程的CPU和內(nèi)存的使用情況
 
// 停止、刪除進(jìn)程
pm2 stop 0 // 停止id為0的進(jìn)程
pm2 stop all // 停止所有進(jìn)程
pm2 delete 0 // 刪除id為0的進(jìn)程
pm2 delete all // 刪除所有進(jìn)程
 
// 重啟、重載
pm2 restart 0 // 重啟id為0的進(jìn)程
pm2 restart all // 重啟所有進(jìn)程
pm2 reload 0 // 0秒停機(jī)重載id為0進(jìn)程(用于 NETWORKED 進(jìn)程)
pm2 reload all // 重載所有進(jìn)程
 
// 日志操作
pm2 logs // 顯示所有進(jìn)程的日志
pm2 logs 0 // 顯示進(jìn)程id為0的日志
pm2 flush // 清空所有日志文件
pm2 reloadLogs // 重載所有日志
pm2 startup // 產(chǎn)生init腳本,保持進(jìn)程活著
 
// 殺死PM2進(jìn)程
pm2 kill

pm2使用方式

使用 pm2 主要有 2 種方式:命令行、配置文件。雖然使用配置文件的方式最終仍然需要使用命令行來啟動(dòng),但兩者的主要區(qū)別是:(1)命令行方式需要將各種配置參數(shù)在命令行中輸入。(2)配置文件方式將各種配置參數(shù)放在了配置文件里面。

舉個(gè)例子:你需要啟動(dòng)一個(gè)應(yīng)用,并指定應(yīng)用名稱為 newApp,設(shè)定入口文件路徑為 index.js ,我們來看看如何通過兩種方式將應(yīng)用名稱和入口文件路徑這兩個(gè)參數(shù)帶進(jìn)去

【1】命令行方式

pm2 start index.js --name newApp

【2】配置文件方式

首先我們需要?jiǎng)?chuàng)建一個(gè)配置文件(pm2.config.js),里面內(nèi)容如下:

// 文件名為 pm2.config.js
module.exports = {
    apps: [{
        name: "newApp", // 應(yīng)用名稱
        script: "./index.js" // 入口文件
    }]
}

然后再在命令行輸入以下內(nèi)容,表明以指定的配置文件啟動(dòng)應(yīng)用

pm2 start pm2.config.js

【3】總結(jié)

通過對(duì)比以上兩種形式,你可以看出:使用配置文件的方式,可以將各種參數(shù)、環(huán)境變量等內(nèi)容 持久化 地保留在文件中,方便批量管理各種應(yīng)用,避免在命令行中由于 遺忘、手誤 等原因?qū)е聠?dòng)參數(shù)的不可控。

創(chuàng)建配置文件的方式

可以自行創(chuàng)建一個(gè) Javascript 文件或者使用以下命令生成配置文件,需要注意的一點(diǎn)是,pm2 要求配置文件的文件名必須以 .config.js 結(jié)尾。

【1】命令生成

pm2 ecosystem

命令生成的配置文件名稱為ecosystem.config.js,格式如下, 可以發(fā)現(xiàn)這個(gè)文件就是導(dǎo)出 一個(gè)對(duì)象,其中有個(gè) apps 屬性,這是一個(gè)列表,其中的每一項(xiàng)都對(duì)應(yīng)一個(gè)應(yīng)用,在每一個(gè)子項(xiàng)的對(duì)象中設(shè)置對(duì)應(yīng)應(yīng)用的配置參數(shù),你可以在配置文件中配置多個(gè)應(yīng)用。

module.exports = {
  apps : [{
    script: 'index.js',
    watch: '.'
  }, {
    script: './service-worker/',
    watch: ['./service-worker']
  }],
 
  deploy : {
    production : {
      user : 'SSH_USERNAME',      host : 'SSH_HOSTMACHINE',
      ref  : 'origin/master',
      repo : 'GIT_REPOSITORY',
      path : 'DESTINATION_PATH',      'pre-deploy-local': '',      'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production',      'pre-setup': ''
    }
  }};

【2】自行創(chuàng)建

如果你自行創(chuàng)建 Javascript 文件,按照以上格式創(chuàng)建即可,注意文件名要以config.js結(jié)尾。

【3】注意

這個(gè)配置文件無論是通過命令創(chuàng)建或者你手工自己創(chuàng)建的,只要符合語法,兩者是沒有任何區(qū)別的。除了 .js 形式的配置文件外,pm2 還支持 .json 和 .yml 形式的配置文件,這三種配置文件的形式本質(zhì)上沒有任何區(qū)別,參數(shù)名稱也完全一致,差異僅在于參數(shù)呈現(xiàn)的方式。

案例

我們先創(chuàng)建幾個(gè)項(xiàng)目文件用于演示,目錄結(jié)構(gòu)如下,demo1目錄存放的項(xiàng)目project1用命令行方式使用pm2,demo2目錄存放的項(xiàng)目project2和project3用配置文件方式使用pm2, 三個(gè)項(xiàng)目都是node.js項(xiàng)目,index.js是非常基礎(chǔ)的 Koa 項(xiàng)目入口文件,ecosystem.config.js是配置文件,各自的 node_modules 文件中只安裝了 koa 框架

pm2
├── demo1
    └── project1
|       ├── index.js
|       └── node_modules
└── demo2
    ├── ecosystem.config.js
    ├── project2
    │   ├── index.js
    │   └── node_modules
    └── project3
        ├── index.js
        └── node_modules

入口文件index.js代碼如下,三個(gè)項(xiàng)目的port分別為 8001、8002、8003

'use strict'

const Koa = require('koa')
const app = new Koa()

const PORT = 8001 // 三個(gè)項(xiàng)目分別為 8001,8002,8003

app.use(ctx => {
    ctx.body = {
        NODE_ENV: process.env.NODE_ENV,
        url: ctx.url,
        port: PORT,
    }
})

app.listen(PORT)

配置文件ecosystem.config.js 代碼如下

module.exports = {
    apps: [{
        cwd: '../demo2/project2',
        name: 'project2',
        script: 'index.js',
        watch: ['.']
    },
        cwd: '../demo2/project3',
        name: 'project3',
        script: 'index.js',
        watch: ['.']
    }]
}

【1】啟動(dòng)應(yīng)用

命令行方式:pm2 start xxx.js

配置文件方式:pm2 start || pm2 start ecosystem.config.js

我們使用命令行方式啟動(dòng)project1應(yīng)用,進(jìn)入到project文件目錄,運(yùn)行pm2 start index.js命令,我們沒有在命令中設(shè)定任何參數(shù),pm2 會(huì)自動(dòng)按照默認(rèn)參數(shù)值進(jìn)行執(zhí)行。例如自動(dòng)將入口文件的文件名index作為應(yīng)用名稱。幾乎每一次命令執(zhí)行完成后,pm2 都會(huì)顯示一個(gè)應(yīng)用列表(如下圖所示),接著你就可以在網(wǎng)頁中輸入:localhost:8001查看project1項(xiàng)目

Node的進(jìn)程管理工具pm2怎么使用

我們接著使用配置文件方式啟動(dòng)project2和project3應(yīng)用,因?yàn)閮蓚€(gè)應(yīng)用的配置在同一個(gè)文件,因此我們只需要運(yùn)行一次配置文件,啟動(dòng)成功后可在網(wǎng)頁中訪問localhost:8002和localhost:8003

Node的進(jìn)程管理工具pm2怎么使用

【2】停止應(yīng)用

使用id停止:pm2 stop <id>

使用name停止:pm2 stop <name>

停止所有應(yīng)用:pm2 stop all

Node的進(jìn)程管理工具pm2怎么使用

【3】重啟應(yīng)用

使用id重啟:pm2 reload <id>

使用name重啟:pm2 reload <name>

重啟所有應(yīng)用:pm2 reload all

Node的進(jìn)程管理工具pm2怎么使用

【4】顯示應(yīng)用列表

pm2 list

pm2 ls

pm2 status

Node的進(jìn)程管理工具pm2怎么使用

【5】以JSON格式顯示應(yīng)用列表

pm2 jlist

pm2 prettylist

Node的進(jìn)程管理工具pm2怎么使用

使用 pm2 jlist 命令,你會(huì)發(fā)現(xiàn)輸出的內(nèi)容很亂,你可以使用 pm2 prettylist 命令來輸出優(yōu)化過的 JSON 格式內(nèi)容

Node的進(jìn)程管理工具pm2怎么使用

【6】查看應(yīng)用信息

pm2 describe id
pm2 describe name

上述的 JSON 格式應(yīng)用列表,輸出了所有應(yīng)用的信息,而且信息十分凌亂,我們可以使用 pm2 describe 命令來查看指定應(yīng)用的信息

Node的進(jìn)程管理工具pm2怎么使用

【7】實(shí)時(shí)打印日志

打印日志:pm2 logs

指定日志行數(shù):pm2 logs --lines  (指定顯示的日志行數(shù))

清空日志:pm2 flush

對(duì)于線上正在運(yùn)行的應(yīng)用,有的時(shí)候需要打印實(shí)時(shí)日志來進(jìn)行調(diào)試排查問題,雖然日志會(huì)自動(dòng)添加到日志文件里面,但是總之不太方便。pm2 提供了logs命令,可以直接實(shí)時(shí)打印日志。

注意:當(dāng)前命令行頁面使用了該命令后,當(dāng)前命令行會(huì)一直處于監(jiān)聽狀態(tài),你需要再新開一個(gè)命令行去敲其他命令

【8】顯示儀表盤

pm2 monit

Node的進(jìn)程管理工具pm2怎么使用

【9】刪除應(yīng)用

通過Id刪除:pm2 delete id

通過name刪除:pm2 delete name

刪除所有應(yīng)用:pm2 delete all

刪除應(yīng)用幾乎不會(huì)造成任何后果,只是在管理列表中刪除了這一項(xiàng),并不會(huì)刪除項(xiàng)目文件

Node的進(jìn)程管理工具pm2怎么使用

【10】配置參數(shù)-應(yīng)用名稱

--name <app_name>

在命令行方式中,使用 --name <app_name> 參數(shù)指定應(yīng)用名稱,上面我們命令行運(yùn)行的project1默認(rèn)名稱為index,現(xiàn)在我們指定名稱為project1

Node的進(jìn)程管理工具pm2怎么使用

【11】配置參數(shù)-監(jiān)聽目錄

監(jiān)聽目錄:--watch

指定目錄不被監(jiān)聽:--ignore-watch

監(jiān)聽目錄用于當(dāng)指定監(jiān)聽目錄文件發(fā)生變化時(shí),pm2 將會(huì)自動(dòng)重啟應(yīng)用

Node的進(jìn)程管理工具pm2怎么使用

除了指定一個(gè)監(jiān)聽目錄外,還可以再繼續(xù)指定某個(gè)目錄不被監(jiān)聽,例如上述的例子,指定了project1目錄為監(jiān)聽目錄,然后你把日志文件放在了這個(gè)目錄下,比如為 logs 目錄,這個(gè)目錄不希望被監(jiān)聽,否則會(huì)形成死循環(huán),這時(shí)候就需要用到另一個(gè)參數(shù) --ignore-watch,輸入一下命令

pm2 start 0 --watch --ignore-watch './logs'

【12】配置參數(shù)-最大內(nèi)存數(shù)

--max-memory-restart xxx(K|M|G)

設(shè)置最大內(nèi)存數(shù),當(dāng)應(yīng)用運(yùn)行時(shí)占用的內(nèi)存超出該數(shù)值后,應(yīng)用將自動(dòng)重啟。命令行方式通過 --max-memory-restart 參數(shù)設(shè)定應(yīng)用運(yùn)行最大內(nèi)存,后續(xù)跟上數(shù)值和單位,單位只能是 K,M,G 三個(gè)值,分別表示 KB,MB,GB 。

Node的進(jìn)程管理工具pm2怎么使用

【13】配置參數(shù)-日志存放路徑

--log <log_path>

日志默認(rèn)會(huì)放置在 $HOME/.pm2/logs/ 目錄下,使用 --log <log_path> 指定日志文件路徑

pm2 start index.js --log ./logs/mylog.log

“Node的進(jìn)程管理工具pm2怎么使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI