pm2學(xué)習(xí)筆記

背景

1. 進(jìn)程管理

進(jìn)程管理主要是指創(chuàng)建,終止和監(jiān)控進(jìn)程。進(jìn)程管理器主要是用來(lái)確保你的應(yīng)用在啟動(dòng)后能夠保持在線。

2. pm2 是什么

pm2 是 nodejs 的進(jìn)程管理器饺饭,默認(rèn)支持負(fù)載均衡铺坞,能夠守護(hù)進(jìn)程起宽。還支持查看應(yīng)用運(yùn)行時(shí)的性能,資源占用情況等济榨。

3. 為什么要用 pm2

普通 node 進(jìn)程的缺陷

  • 普通啟動(dòng)方式:node index.js燎含,關(guān)閉終端就結(jié)束進(jìn)程
  • node 進(jìn)程掛掉和“僵死”:
    • 進(jìn)程掛掉大概有以下幾種原因:
      • 內(nèi)存泄漏:內(nèi)存一點(diǎn)點(diǎn)積累到達(dá)臨界值爆掉
      • 死循環(huán)導(dǎo)致內(nèi)存突增爆掉
      • 死循環(huán)導(dǎo)致磁盤寫爆
      • 被動(dòng)被kill,主動(dòng)退出腿短。
    • “僵死”大概有以下幾種可能:
      • 有某個(gè)非常耗時(shí)的cpu操作正在執(zhí)行
      • 寫了個(gè)死循環(huán)(死循環(huán)不一定會(huì)導(dǎo)致服務(wù)掛掉屏箍,有可能只會(huì)cpu飆升,讓服務(wù)處于假死狀態(tài))

不管發(fā)生上面哪種情況橘忱,都會(huì)造成服務(wù)的不可訪問(wèn)赴魁,需要等我們自己去發(fā)現(xiàn)問(wèn)題后,然后重啟應(yīng)用钝诚。

pm2 啟動(dòng)的優(yōu)勢(shì)

  • 后臺(tái)運(yùn)行:pm2可以后臺(tái)運(yùn)行颖御,終端關(guān)閉不影響。
  • 自動(dòng)重啟:在應(yīng)用意外掛掉或者機(jī)器重啟后凝颇,能夠自動(dòng)重啟應(yīng)用
  • 自動(dòng)負(fù)載均衡:支持集群模式潘拱,可以方便的啟動(dòng)多個(gè)node進(jìn)程,充分利用cpu和內(nèi)存
  • 0 秒停機(jī)重啟:集群模式下拧略,可以達(dá)到重啟時(shí)不停止服務(wù)
  • 可以監(jiān)控應(yīng)用性能芦岂,資源占用情況等,自動(dòng)輸出日志
  • 開(kāi)發(fā)模式支持熱更新

使用

1. 安裝

pm2 本質(zhì)是一個(gè) cli 垫蛆,可以通過(guò) npm 進(jìn)行安裝

$ npm install pm2
# or
$ yarn add pm2

2. 啟動(dòng)

開(kāi)發(fā)模式

開(kāi)發(fā) node 應(yīng)用的時(shí)候禽最,修改代碼過(guò)后每次都要重啟下應(yīng)用,很麻煩袱饭。使用 pm2-dev 命令啟動(dòng)應(yīng)用川无,應(yīng)用會(huì)在在代碼發(fā)生變更過(guò)后,自動(dòng)重啟虑乖。

$ pm2-dev start server.js

生產(chǎn)模式

  • pm2 start

    應(yīng)用部署到生產(chǎn)環(huán)境后懦趋,可以使用 pm2 start 來(lái)啟動(dòng)應(yīng)用

    $ pm2 start server.js
    
    ┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
    │ id  │ name      │ namespace   │ version │ mode    │ pid      │ uptime │ ?    │ status    │ cpu      │ mem      │ user     │ watching │
    ├─────┼───────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
    │ 0   │ server    │ default     │ 0.1.0   │ fork    │ 17471    │ 71s    │ 0    │ online    │ 0%       │ 77.5mb   │ ayo      │ disabled │
    └─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
    

    該命令啟動(dòng)的應(yīng)用,默認(rèn)支持進(jìn)程守護(hù)疹味,并且可以通過(guò) pm2 進(jìn)行監(jiān)控

  • 一些可以傳給 cli 的常用配置

    • --name <app_name>

      指定應(yīng)用名仅叫。不傳的話默認(rèn)為應(yīng)用入口文件的文件名。如上圖的 server

    • --watch

      在文件發(fā)生變化時(shí)自動(dòng)重啟佛猛。類似于開(kāi)發(fā)模式的 pm2-dev start 命令

    • --max-memory-restart <200MB>

      該配置項(xiàng)設(shè)置后惑芭,應(yīng)用會(huì)在運(yùn)行內(nèi)存達(dá)到設(shè)定值 200MB 后,自動(dòng)重啟继找。避免了 Node.js heap out of memory error 問(wèn)題。

    • --log <log_path>

      指定日志輸出目錄

    • --restart-delay <delay in ms>

      設(shè)置自動(dòng)重啟的延遲時(shí)間

    • --cron <cron_pattern>

      定時(shí)任務(wù)逃沿∮ざ桑可以設(shè)置 一天中的固定重啟時(shí)間幻锁, 一周內(nèi)固定重啟日期,或者 一個(gè)時(shí)間間隔(如 每 48 小時(shí)重啟一次)边臼。cron_pattern 請(qǐng)參照這里

    • --no-autorestart

      關(guān)掉應(yīng)用的自動(dòng)重啟

更多配置請(qǐng)參照 集成部署EcosystemFile

3. 管理進(jìn)程

下面是部分常用命令行

$ pm2 restart app_name
$ pm2 reload app_name
$ pm2 stop app_name
$ pm2 delete app_name
  • app_name 的位置除了傳應(yīng)用名哄尔,還可以傳:
    • all 針對(duì)所有進(jìn)程進(jìn)行操作
    • id 針對(duì)特定id的進(jìn)程進(jìn)行操作
  • 集群模式下,restart中斷服務(wù)柠并,而reload不會(huì)

詳細(xì)介紹下以下命令:

查看應(yīng)用列表 pm2 list

$ pm2 list

┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name      │ namespace   │ version │ mode    │ pid      │ uptime │ ?    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼───────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ app       │ default     │ 1.0.0   │ fork    │ 16573    │ 9m     │ 0    │ online    │ 0%       │ 57.3mb   │ ayo      │ disabled │
│ 2   │ index     │ default     │ 1.0.0   │ fork    │ 0        │ 0      │ 16   │ errored   │ 0%       │ 0b       │ ayo      │ disabled │
│ 1   │ server    │ default     │ 0.1.0   │ fork    │ 17471    │ 71s    │ 0    │ online    │ 0%       │ 77.5mb   │ ayo      │ disabled │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

運(yùn)行上面的命令后岭接,可以查看所有 pm2 啟動(dòng)的應(yīng)用

  • id:應(yīng)用 id
  • name:應(yīng)用名稱
  • namespace:在配置文件里面可以給應(yīng)用設(shè)置 namespace。設(shè)置后可以使用命令行單獨(dú)啟動(dòng)或停止某個(gè) namespace 的應(yīng)用臼予。詳細(xì)用法見(jiàn) 集成部署EcosystemFile
  • mode: 進(jìn)程的運(yùn)行方式鸣戴。分為 forkcluster。詳細(xì)介紹見(jiàn) 集群模式
  • pid:進(jìn)程id
  • uptime:運(yùn)行時(shí)間
  • ?:重啟次數(shù)(從0開(kāi)始計(jì)數(shù))
  • status:進(jìn)程是否在線
  • cpu:cpu占用率
  • mem:內(nèi)存占用大小

查看應(yīng)用詳情信息 pm2 show app_name|app_id

$ pm2 show server
Describing process with id 1 - name server
┌───────────────────┬──────────────────────────────────────────────────┐
│ status            │ online                                           │
│ name              │ server                                           │
│ namespace         │ default                                          │
│ version           │ 0.1.0                                            │
│ restarts          │ 0                                                │
│ uptime            │ 60m                                              │
│ script path       │ /home/ayo/dev/demo/analytics-dashboard/server.js │
│ script args       │ N/A                                              │
│ error log path    │ /home/ayo/.pm2/logs/server-error.log             │
│ out log path      │ /home/ayo/.pm2/logs/server-out.log               │
│ pid path          │ /home/ayo/.pm2/pids/server-1.pid                 │
│ interpreter       │ node                                             │
│ interpreter args  │ N/A                                              │
│ script id         │ 1                                                │
│ exec cwd          │ /home/ayo/dev/demo/analytics-dashboard           │
│ exec mode         │ fork_mode                                        │
│ node.js version   │ 17.0.0                                           │
│ node env          │ N/A                                              │
│ watch & reload    │ ?                                                │
│ unstable restarts │ 0                                                │
│ created at        │ 2021-12-03T08:33:01.489Z                         │
└───────────────────┴──────────────────────────────────────────────────┘

運(yùn)行上面的命令后粘拾,可以查看應(yīng)用詳情信息窄锅。
除了 pm2 list 命令返回的信息以外,還可以獲取幾個(gè)常用信息:

  • script path:?jiǎn)?dòng)入口的文件路徑
  • script args:?jiǎn)?dòng)文件的參數(shù)
  • error log path:錯(cuò)誤日志的文件路徑
  • out log path:輸出日志的文件路徑
  • exec mode:進(jìn)程的模式
  • watch&reload:是否開(kāi)啟監(jiān)聽(tīng)文件變動(dòng)重啟
  • unstable restarts:不穩(wěn)定的重啟次數(shù)

查看日志 pm2 logs

$ pm2 logs

C:\Users\fish2\.pm2\pm2.log last 15 lines:
PM2        | 2022-06-22T17:26:49: PM2 log: Concurrent actions   : 2
PM2        | 2022-06-22T17:26:49: PM2 log: SIGTERM timeout      : 1600
PM2        | 2022-06-22T17:26:49: PM2 log: ===============================================================================
PM2        | 2022-06-22T17:26:49: PM2 log: App [server:0] starting in -fork mode-
PM2        | 2022-06-22T17:26:49: PM2 log: App [server:0] online
PM2        | 2022-06-23T08:57:15: PM2 log: Stopping app:server id:0
PM2        | 2022-06-23T08:57:15: PM2 log: App [server:0] exited with code [1] via signal [SIGINT]
PM2        | 2022-06-23T08:57:15: PM2 log: pid=18708 msg=process killed
PM2        | 2022-06-23T09:35:21: PM2 log: App [server:0] starting in -fork mode-
PM2        | 2022-06-23T09:35:21: PM2 log: App [server:0] online
PM2        | 2022-06-23T09:59:15: PM2 log: Stopping app:server id:0
PM2        | 2022-06-23T09:59:15: PM2 log: App [server:0] exited with code [1] via signal [SIGINT]
PM2        | 2022-06-23T09:59:15: PM2 log: pid=7828 msg=process killed
PM2        | 2022-06-23T10:05:22: PM2 log: App [server:0] starting in -fork mode-
PM2        | 2022-06-23T10:05:22: PM2 log: App [server:0] online

C:\Users\fish2\.pm2\logs\server-error.log last 15 lines:
C:\Users\fish2\.pm2\logs\server-out.log last 15 lines:
0|server   |       [Symbol(kNeedDrain)]: false,
0|server   |       [Symbol(corked)]: 0,
0|server   |       [Symbol(kOutHeaders)]: [Object: null prototype]
0|server   |     },
0|server   |     _currentUrl: 'http:undefined/appmarket/api/client/types/',
0|server   |     [Symbol(kCapture)]: false
0|server   |   },
0|server   |   response: undefined,
0|server   |   isAxiosError: true,
0|server   |   toJSON: [Function (anonymous)]
0|server   | }
0|server   | ERR! [SSR] generate html template error
0|server   | [SSR] generating html content
0|server   | [SSR] generating html content
0|server   | [SSR] generating html content

還可以直接進(jìn)入日志保存的目錄查看缰雇。示例中日志目錄為:C:\Users\fish2\.pm2\pm2.log

監(jiān)控所有進(jìn)程 pm2 monit

pm2 monit
  • 左上角 Process list:進(jìn)程列表
  • 右上角 Logs:所有實(shí)時(shí)日志
  • 左下角 Custom Metrics:當(dāng)前選中進(jìn)程的指標(biāo)
  • 右下角 Metadata:進(jìn)程的信息

集成部署EcosystemFile

當(dāng)我們需要管理多個(gè)應(yīng)用入偷,或者應(yīng)用有多個(gè)運(yùn)行環(huán)境時(shí),使用 pm2 start 來(lái)啟動(dòng)應(yīng)用+配置參數(shù)是很不方便的械哟。所以疏之,pm2 支持使用配置文件來(lái)啟動(dòng)和管理應(yīng)用。

1. 生成配置文件

$ pm2 init simple

運(yùn)行該命令可在工程下初始化一個(gè) ecosystem.config.js 配置文件

module.exports = {
  apps : [{
    name   : "app1",
    script : "./app.js"
  }]
}
  • app是要管理應(yīng)用的數(shù)組暇咆,每個(gè)對(duì)象都是一個(gè)應(yīng)用的配置

  • 你也可以自己創(chuàng)建一個(gè)配置文件体捏,文件名以 .config.js 結(jié)尾,pm2 會(huì)自動(dòng)識(shí)別并讀取該文件糯崎。

2. 配置項(xiàng)

基礎(chǔ)配置

  • name:進(jìn)程名
  • script:node 啟動(dòng)文件的路徑
  • cwd :項(xiàng)目所在的目錄
  • args :通過(guò)命令行傳遞給node啟動(dòng)文件的參數(shù)
  • interpreter :編譯器的絕對(duì)路徑(默認(rèn) node )
  • interpreter_args :傳給編譯器的參數(shù)
  • node_args:傳給 node 的參數(shù)

進(jìn)階配置

  • instances :應(yīng)用啟動(dòng)實(shí)例個(gè)數(shù)几缭,僅在cluster模式有效
  • exec_mode :應(yīng)用程序啟動(dòng)模式∥帜兀可選 clusterfork年栓,默認(rèn)為 fork
  • watch :是否啟用監(jiān)控模式,默認(rèn)是 false薄霜。如果設(shè)置成 true某抓,當(dāng)應(yīng)用程序變動(dòng)時(shí),pm2會(huì)自動(dòng)重載
  • ignore_watch :不用監(jiān)聽(tīng)的文件惰瓜,如:
    ignore_watch: [
       'node_modules',
       'logs',
    ]
    
  • max_memory_restart :應(yīng)用運(yùn)行內(nèi)存達(dá)到設(shè)定值后否副,會(huì)自動(dòng)重啟。避免了 Node.js heap out of memory error 問(wèn)題
  • env :應(yīng)用中的默認(rèn)環(huán)境變量
  • env_ :命令行中可傳入的環(huán)境變量崎坊,覆蓋默認(rèn)環(huán)境變量
  • source_map_support :默認(rèn) true备禀,支持 sourcemap 文件

日志配置

  • log_date_format :日志時(shí)間格式
  • error_file :錯(cuò)誤日志存放路徑
  • out_file :全部日志存放路徑
  • combine_logs:是否將不同 id 的進(jìn)程日志合并
  • merge_logs:同上

控制流

  • min_uptime:應(yīng)用被視為已啟動(dòng)最小運(yùn)行時(shí)間

    min uptime of the app to be considered started

  • max_restarts: 在應(yīng)用狀態(tài)被認(rèn)定為 error 前,一定時(shí)間(min_uptime 指定的時(shí)間,若未配置曲尸,則為 1 秒)內(nèi)的連續(xù)不穩(wěn)定重啟次數(shù)

    number of consecutive unstable restarts (less than 1sec interval or custom time via min_uptime) before your app is considered errored and stop being restarted

以上兩個(gè)配置項(xiàng)一般需要同時(shí)設(shè)置赋续。
示例:
server.js

setTimeout(function () {
    console.log('killed');
    process.exit(1)
}, 1000);

ecosystem.config.js

module.exports = {
  apps: [{
    name: "app-market",
    script: "./server.js",
    max_restarts: 4,
    min_uptime: 5000,
  }]
}

如示例所示,server 應(yīng)用在啟動(dòng) 1s 后另患,會(huì)自己強(qiáng)行結(jié)束進(jìn)程纽乱。這時(shí), pm2 由于進(jìn)程守護(hù)的特性昆箕,會(huì)去重新拉起應(yīng)用鸦列。示例中設(shè)置了 min_uptime 為 5000(即 5s),max_restarts 為 4 次鹏倘,所以 pm2 在進(jìn)程停止(1s)后去重啟進(jìn)程薯嗤,5s 鐘可以內(nèi)重啟次數(shù)肯定可以達(dá)到 4 次。達(dá)到設(shè)定次數(shù)后第股,則停止重啟應(yīng)用应民。

max_restarts

當(dāng)?shù)?4 次重啟時(shí),應(yīng)用狀態(tài)將變?yōu)?error夕吻,pm2 將停止重啟應(yīng)用诲锹。上圖重啟次數(shù)顯示為 3,是因?yàn)槭菑?0 開(kāi)始計(jì)數(shù)的(0涉馅, 1归园, 2, 3 共 4 次)

  • listen_timeout:如果應(yīng)用沒(méi)有發(fā)送 ready 信號(hào)稚矿,間隔多長(zhǎng)時(shí)間 reload庸诱。單位為毫秒。
  • wait_ready:是否等待進(jìn)程發(fā)送 ready 信號(hào)晤揣。默認(rèn)為 false桥爽。設(shè)置為 true 后,需要在應(yīng)用內(nèi)部添加 process.send('ready') 語(yǔ)句發(fā)送 ready 信號(hào)昧识。

以上兩個(gè)配置項(xiàng)一般需要搭配使用钠四,詳細(xì)使用場(chǎng)景見(jiàn) 優(yōu)雅的啟動(dòng)與停止應(yīng)用

  • kill_timeout:從告訴進(jìn)程要關(guān)閉到強(qiáng)制關(guān)閉進(jìn)程的間隔時(shí)間。

    module.exports = {
      apps : [{
        name: 'app',
        script: './app.js',
        kill_timeout: 3000
      }]
    }
    

    當(dāng) pm2 要停止或重啟一個(gè)應(yīng)用時(shí)跪楞,會(huì)按順序給你的進(jìn)程發(fā)送一系列系統(tǒng)信號(hào)缀去。它首先會(huì)發(fā)送一個(gè) SIGINT 信號(hào)告訴你應(yīng)用將會(huì)被停止。然后 pm2 會(huì)等待 3s(示例中 kill_timeout 設(shè)置的時(shí)間)甸祭。若 3s 后應(yīng)用沒(méi)有自己停止(exit)缕碎,pm2 會(huì)發(fā)送一個(gè) SIGKILL 信號(hào)來(lái)強(qiáng)制停止應(yīng)用。

    When a process is stopped/restarted by PM2, some system signals are sent to your process in a given order.
    First a SIGINT a signal is sent to your processes, signal you can catch to know that your process is going to be stopped. If your application does not exit by itself before 1.6s (customizable) it will receive a SIGKILL signal to force the process exit.

    詳細(xì)使用場(chǎng)景見(jiàn) 優(yōu)雅的啟動(dòng)與停止應(yīng)用

  • shutdown_with_message:使用 process.send(‘shutdown’) 方式來(lái)代替 process.kill(pid, SIGINT) 停止應(yīng)用池户。默認(rèn)值為 false咏雌。
    主要用于進(jìn)程無(wú)法使用信號(hào)流來(lái)關(guān)閉的場(chǎng)景凡怎。

    When signals are not available your process gets killed. In that case you have to use --shutdown-with-message via CLI or shutdown_with_message in Ecosystem File and listen for shutdown events.

  • restart_delay:進(jìn)程掉線后,等待多長(zhǎng)時(shí)間自動(dòng)重啟处嫌, 默認(rèn) 0s

  • autorestart: 是否開(kāi)啟自動(dòng)重啟栅贴。默認(rèn)開(kāi)啟斟湃。

  • cron_restart: 定時(shí)重啟熏迹。可以設(shè)置 一天中的固定重啟時(shí)間凝赛, 一周內(nèi)固定重啟日期注暗,或者 一個(gè)時(shí)間間隔(如 每 48 小時(shí)重啟一次)cron_pattern 請(qǐng)參照這里

集群模式

1. pm2 的 cluster 模式與 fork 模式的區(qū)別

  • fork 模式
    fork 模式使用最基本的進(jìn)程運(yùn)行方式墓猎,只是單實(shí)例運(yùn)行server捆昏,無(wú)法實(shí)現(xiàn) TCP 連接共享。并且:

    我們知道 JavaScript 代碼是運(yùn)行在單線程上的毙沾,換句話說(shuō)一個(gè) Node.js 進(jìn)程只能運(yùn)行在一個(gè) CPU 上骗卜。那么如果用 Node.js 來(lái)做 Web Server,就無(wú)法享受到多核運(yùn)算的好處

  • cluster 模式
    集群模式允許 nodejs 應(yīng)用程序在所有可用的 CPU 上進(jìn)行擴(kuò)展左胞,而無(wú)需修改任何代碼寇仓。可以顯著提高應(yīng)用程序的性能和可靠性烤宙,具體取決于可用的 CPU 數(shù)量遍烦。在底層,它使用了 Node.js 集群模塊躺枕,這樣擴(kuò)展后的應(yīng)用程序的子進(jìn)程可以自動(dòng)共享服務(wù)器端口服猪。要了解更多信息,請(qǐng)參閱 Node.js 集群拐云。

    The cluster mode allows networked Node.js applications (http(s)/tcp/udp server) to be scaled across all CPUs available, without any code modifications. This greatly increases the performance and reliability of your applications, depending on the number of CPUs available. Under the hood, this uses the Node.js cluster module such that the scaled application’s child processes can automatically share server ports. To learn more, see How It Works in the official Node.js documentation on the cluster module.

2. 使用

  • 命令行啟動(dòng)
$ pm2 start app.js -i max

max 的意思是:把應(yīng)用部署到服務(wù)器所有可用的CPU上罢猪,并運(yùn)行盡可能多的進(jìn)程

  • 通過(guò)配置文件啟動(dòng)

ecosystem.config.js

module.exports = {
  apps : [{
    script    : "app.js",
    instances : "max",
    exec_mode : "cluster"
  }]
}

注意:pm2 的負(fù)載均衡的特性是建立在以集群模式啟動(dòng)的基礎(chǔ)上的,默認(rèn)的啟動(dòng)模式是 fork叉瘩,不支持負(fù)載均衡

3. 重載 Reload

集群模式下膳帕,由于 pm2 的 restart 命令會(huì)先殺掉所有進(jìn)程,再重新拉起房揭,會(huì)造成服務(wù)終止备闲。但是 reload 命令可以實(shí)現(xiàn) 0s 重啟,維護(hù)升級(jí)的時(shí)候不需要停機(jī)捅暴。
當(dāng)重載時(shí)間過(guò)長(zhǎng)或者無(wú)法重載時(shí)恬砂,pm2 會(huì)自動(dòng)切換成 restart

4. 動(dòng)態(tài)擴(kuò)展

如果希望在運(yùn)行中動(dòng)態(tài)增加實(shí)例數(shù),可以使用下面的命令:

$ pm2 scale <app_name> +4 # add 4 additional workers in realtime

Docker 集成

1. 在容器中安裝 pm2

RUN npm install pm2 -g

2. 啟動(dòng) pm2

  • 直接啟動(dòng)應(yīng)用
CMD ["pm2-runtime", "app.js"]
  • 通過(guò)配置文件啟動(dòng)
CMD ["pm2-runtime", "ecosystem.config.js"]

注意:在容器中使用 pm2 啟動(dòng)應(yīng)用時(shí)蓬痒,要使用 pm2-runtime 而不是 pm2 start, 因?yàn)椋?/strong>

pm2 是默認(rèn)后臺(tái)啟動(dòng)的泻骤, docker 感知不到。CMD 命令執(zhí)行完成,docker 容器就結(jié)束了狱掂。 所以直接使用 node app.js 啟動(dòng)應(yīng)用后演痒,應(yīng)用能一直在容器中保持運(yùn)行。 pm2 以后臺(tái)形式運(yùn)行趋惨,CMD 命令執(zhí)行完成鸟顺,docker 就認(rèn)為可以退出了。

所以需要使用 pm2-runtime 來(lái)進(jìn)行處理器虾。pm2-runtime 是為 Docker 容器設(shè)計(jì)的讯嫂,它將應(yīng)用程序置于前臺(tái),從而使容器保持運(yùn)行狀態(tài)兆沙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末欧芽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子葛圃,更是在濱河造成了極大的恐慌千扔,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件库正,死亡現(xiàn)場(chǎng)離奇詭異曲楚,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)诀诊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門洞渤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人属瓣,你說(shuō)我怎么就攤上這事载迄。” “怎么了抡蛙?”我有些...
    開(kāi)封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵护昧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我粗截,道長(zhǎng)惋耙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任熊昌,我火速辦了婚禮绽榛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘婿屹。我一直安慰自己灭美,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布昂利。 她就那樣靜靜地躺著届腐,像睡著了一般铁坎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上犁苏,一...
    開(kāi)封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天硬萍,我揣著相機(jī)與錄音,去河邊找鬼围详。 笑死朴乖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的短曾。 我是一名探鬼主播寒砖,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼赐劣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嫉拐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起魁兼,我...
    開(kāi)封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤婉徘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后咐汞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體盖呼,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年化撕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了几晤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡植阴,死狀恐怖蟹瘾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掠手,我是刑警寧澤憾朴,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站喷鸽,受9級(jí)特大地震影響众雷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜做祝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一砾省、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧混槐,春花似錦编兄、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)炮姨。三九已至,卻和暖如春碰煌,著一層夾襖步出監(jiān)牢的瞬間舒岸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工芦圾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛾派,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓个少,卻偏偏與公主長(zhǎng)得像洪乍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子夜焦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 概念 PM2(process manage)是JavaScript運(yùn)行時(shí)Node.js的進(jìn)程管理器壳澳。 基本操作 安...
    F_wind閱讀 963評(píng)論 0 3
  • 前言 PM2是node進(jìn)程管理工具,可以利用它來(lái)簡(jiǎn)化很多node應(yīng)用管理的繁瑣任務(wù)茫经,如性能監(jiān)控巷波、自動(dòng)重啟、負(fù)載均衡...
    AmazRan閱讀 1,318評(píng)論 0 1
  • 1卸伞、pm2的安裝: npm install -g pm2@latest //@latest表示安裝最新的版本 ...
    liuxuech閱讀 840評(píng)論 0 0
  • 一、PM2是什么遂黍? PM2是 node.js項(xiàng)目 的進(jìn)程管理工具终佛,常用功能如下: 讓 node.js項(xiàng)目 能在...
    LearnAnything閱讀 314評(píng)論 0 0
  • 一、概述 1妓湘、pm2是什么查蓉?pm2是node進(jìn)程管理工具。 2榜贴、為什么選它豌研?與其他工具的對(duì)比 二、特性 1唬党、后臺(tái)運(yùn)...
    我才是大田田閱讀 32,417評(píng)論 0 18