Jenkins 遠程啟動nodejs失敗,使用pm2守護Nodejs
- 2020 年 3 月 7 日
- 筆記
一、概述
使用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