一、概述
使用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