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


一、概述

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

ssh root@192.168.10.1 'cd /data/test;nohup npm start &'

 

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

cd /data/test;nohup npm start &

 是可以啟動的。

 

具體原因,參考鏈接:

https://www.cnblogs.com/zhenbianshu/p/7152327.html

大致意思是,如果遠程執行的命令,不是守護進程。即使加了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命令,請參考鏈接:
https://www.jianshu.com/p/eb98e639f41e

 

三、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,更多的參數可以點擊這里,查看官方文檔。

http://pm2.keymetrics.io/docs/usage/cluster-mode/

 

注意:當nodejs進程停止時,pm2會自動啟動進程。

 

本文參考鏈接:

https://newsn.net/say/pm2-start-json.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM