使用Jenkins 远程ssh到linux,使用命令:
ssh?root@192.168.10.1?'cd?/data/test;nohup?npm?start?&'
发现linux服务器的node进程没有启动。但是本地执行命令:
cd?/data/test;nohup?npm?start?&
?是可以启动的。
大致意思是,如果远程执行的命令,不是守护进程。即使加了nohup,关闭ssh连接后,当前用户启动的进程会全部终止。
因此,远程执行的命令,必须是守护进程才行。
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的进程
由于公司的Nodejs项目,比如test,它有4个服务,因此有4个app.js。
在package.json里面,有定义启动命令。比如:
"start:client":?"cd?./client?&&?npm?start",
由于package.json里面有定义一些关联启动命令,因此直接用pm2启动4个app.js,会导致应用异常。
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",
}
下面的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":?{
??????
????}
??}]
}
?说明:
test.sh
#!/bin/bash
PROJECT_HOME=/data/test
source?/etc/profile?&&?cd?$PROJECT_HOME;nohup?/usr/bin/npm?start?&
当然,pm2的参数还有很多很多很多,这里仅仅是个范例demo