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

1、概述

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

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

 

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

cd /data/test;nohup npm start &

 是能夠啓動的。linux

 

具體緣由,參考連接:shell

http://www.javashuo.com/article/p-zdgctson-m.htmlnpm

大體意思是,若是遠程執行的命令,不是守護進程。即便加了nohup,關閉ssh鏈接後,當前用戶啓動的進程會所有終止。json

所以,遠程執行的命令,必須是守護進程才行。api

 

2、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/eb98e639f41ebash

 

3、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

相關文章
相關標籤/搜索