Jenkins 遠程啟動nodejs失敗,使用pm2守護Nodejs

一、概述

使用Jenkins 遠程ssh到linux,使用命令:

ssh [email protected] 'cd /data/test;nohup npm start &'

發現linux伺服器的node進程沒有啟動。但是本地執行命令:

cd /data/test;nohup npm start &

 是可以啟動的。

大致意思是,如果遠程執行的命令,不是守護進程。即使加了nohup,關閉ssh連接後,當前用戶啟動的進程會全部終止。

因此,遠程執行的命令,必須是守護進程才行。

二、pm2守護Nodejs

簡介

pm2是nodejs的一個帶有負載均衡功能的應用進程管理器的模組,類似有Supervisor,forever,用來進行進程管理。

安裝

npm install pm2 -g

啟動

pm2 start app.js  pm2 start app.js --name my-api #my-api為PM2進程名稱  pm2 start app.js -i 0 #根據CPU核數啟動進程個數  pm2 start app.js --watch #實時監控app.js的方式啟動,當app.js文件有變動時,pm2會自動reload

查看進程

pm2 list  pm2 show 0 或者 # pm2 info 0 #查看進程詳細資訊,0為PM2進程id

停止

pm2 stop all #停止PM2列表中所有的進程  pm2 stop 0 #停止PM2列表中進程為0的進程

三、pm2啟動腳本

由於公司的Nodejs項目,比如test,它有4個服務,因此有4個app.js。

在package.json裡面,有定義啟動命令。比如:

"start:client": "cd ./client && npm start",

由於package.json裡面有定義一些關聯啟動命令,因此直接用pm2啟動4個app.js,會導致應用異常。

json格式

pm2 start npm — start這條命令是pm2的萬能命令,pm2 start ,就是這一系列命令中的最豪華命令。這個json我們可以理解為一個任務參數描述文件。通過這個json文件,我們把在命令行裡面不好描述的各種參數放到一個json文件裡面來

pm2 start <json>.json

pm2 start命令中的json格式詳解

最精簡版本

{      "name": "manage",      //項目名稱      "script": "./bin/www", //要執行的腳本      "cwd":"./",            //項目所在目錄  }

執行shell文件版本

{      "name": "manage",      //項目名稱      "script": "./bin/www.sh", //要執行的腳本      "cwd":"./",            //項目所在目錄      "exec_interpreter": "bash",  }

實戰例子demo

下面的test.json是公司項目

{    "apps": [{      "name": "test",  //項目名稱      "script": "test.sh",  //要執行的腳本      "cwd": "/opt/script/",  //腳本所在目錄      "exec_interpreter": "bash",   //應用程式的腳本類型      "exec_mode": "fork",      "max_memory_restart": "1G",      "autorestart": true,      "node_args": [],      "args": [],      "env": {              }    }]  }

 說明:

  • apps:json結構,apps是一個數組,每一個數組成員就是對應一個pm2中運行的應用
  • name:應用程式名稱
  • cwd:應用程式所在的目錄
  • script:應用程式的腳本路徑
  • log_date_format:
  • error_file:自定義應用程式的錯誤日誌文件
  • out_file:自定義應用程式日誌文件
  • pid_file:自定義應用程式的pid文件
  • instances:
  • min_uptime:最小運行時間,這裡設置的是60s即如果應用程式在60s內退出,pm2會認為程式異常退出,此時觸發重啟max_restarts設置數量
  • max_restarts:設置應用程式異常退出重啟的次數,默認15次(從0開始計數)
  • cron_restart:定時啟動,解決重啟能解決的問題
  • watch:是否啟用監控模式,默認是false。如果設置成true,當應用程式變動時,pm2會自動重載。這裡也可以設置你要監控的文件。
  • merge_logs:
  • exec_interpreter:應用程式的腳本類型,這裡使用的shell,默認是nodejs
  • exec_mode:應用程式啟動模式,這裡設置的是cluster_mode(集群),默認是fork
  • autorestart:啟用/禁用應用程式崩潰或退出時自動重啟
  • vizion:啟用/禁用vizion特性(版本控制)

test.sh

#!/bin/bash    PROJECT_HOME=/data/test    source /etc/profile && cd $PROJECT_HOME;nohup /usr/bin/npm start &

當然,pm2的參數還有很多很多很多,這裡僅僅是個範例demo