Open yaofly2012 opened 4 years ago
--
明确后面的是自定义参数
# Pass extra arguments to the script
-- arg1 arg2 arg3
其中自定义参数可以通过process.argv
访问(从第二个实参开始)
process.argv[0] // node路径
process.argv[1] // pm2的执行文件路径(pm2/lib/ProcessContainerFork.js)
// 记下来就是自定义参数了
process.argv[2] === arg1
process.argv[3] === arg2
process.argv[4] === arg3
PM2 CLI
主动关闭;监听信号
SIGINT
信号,告诉process要关闭了
process.exit()
process.on('SIGINT', function() {
db.stop(function(err) {
process.exit(err ? 1 : 0); // 清理完自己关闭进程
});
});
// kill
process.on('SIGTERM', (err) => {
db.stop(function(err) {
process.exit(err ? 2 : 0); // 区分SIGINT
});
});
2. 如果一段时间后,process没有关闭自己(即没有执行`process.exit()`),那PM2发送`SIGKILL`信号,告诉process,我要强制关闭你了。
### `SIGINT`(`SIGnal INTerrupt`的缩写)
PM2 `restart/reload/stop` process时触发
### `SIGKILL`(`SIGnal KILL`的缩写)
## 三、启动
1. process主动告诉PM2: `ready`
2. PM2可以等process ready(`--wait-ready`),但是process要在指定的时间内(`--listen-timeout`)一定ready
## 科普
1. 跨进程通讯 ?
2. `process.exit` & 实参意义?
错误码都是有特殊含义的[process_exit_codes](http://nodejs.cn/api/process.html#process_exit_codes)
3. CLI参数规范?
`--`, `-`, `name=vlaue`
应用的日志输出管理(通过console模块记录的log):
{
message: <string> // 应用中console.log打印的数据
timestamp: <string> // 日志记录的时间
type: <enum> // 日志类型: out, err, PM2
process_id: int // process id(PM2内部使用的进程ID)
app_name: <string> // 应用名称
}
--merge-logs\
--log-date-format="YYYY-MM-DD HH:mm:ss"\
--log /opt/logs/$appName/outerr.log\
--output /opt/logs/$appName/out.log\
--error /opt/logs/$appName/err.log
日志文件不能无限增长的,要不然磁盘空间全被日志文件占据了。
利用PM2 JS API可以在worker进程里调用pm2相关方法。相当于用编程的方式操作上层的PM2。
注意:
pm2.launchBus((error, pm2_bus) => {})
可以收到所有进程利用process.send
发送的消息。并且每个进程都会收到,可以实现消息广播。
const pm2 = require('pm2')
// 监听函数
pm2.launchBus(function(err, pm2_bus) {
/**
package结构:
{
process: {
namespace: 'default',
rev: '781cefa74f9f6c9c7094c9ef41609a5e12c15b99',
name: 'server',
pm_id: 1
},
data: { success: true },
at: 1669016559533
}
*/
pm2_bus.on('process:msg', function(packet) {
console.log(packet)
})
})
// 触发消息
process.send({
type : 'process:msg',
data : {
success : true
}
})
pm2.sendDataToProcessId(packet)
向指定进程发消息,过程正好跟pm2.launchBus
相反。
const pm2 = require('pm2');
// 触发消息
pm2.sendDataToProcessId({
id: 124, // 可以从pm2.list接口里获取
type: 'process:msg',
top: true,
data: { success: true }
})
// worker里监听消息
process.on('message', function(packet) {})
PM2(Process Manager 2)
一、概述
是什么?
看官网定义好像还是不知道pm2干嘛的。我们在通过
node
启动nodejs应用后,当关闭控制台应用程序也就被关闭了。但是通过pm2启动应用则不会这样,并且pm2可以让应用一直运行。总结
实际是管理APP(即应用),让应用可以24/7运行,并且以多线程的方式启动应用。 这个通过
pm2 monit
命令可以看下Metadata
:App Name
;Process
;Issues:
online 24/7
是什么鬼? 额,原来表示的是24小时*7天的意思,即007
。干什么的?
daemonize,monitor application;
不只是nodejs,还可以py,sh
Process Management's
action
:restart
啥区别?App
属性Issues:
pm2 start app.js
后为啥启动了三个控制台?科普:
Process Management
分类
参考: