TODO:浅谈pm2基本工作原理
要谈Node.js pm2的工作原理,需要先来了解撒旦(Satan)和上帝(God)的关系。
撒旦(Satan),主要指《圣经》中的堕天使(也称堕天使撒旦),他是反叛上帝耶和华的堕天使(Fallen Angels),曾经是上帝座前的天使,后来他因骄傲自大妄想与神同等而堕落成为魔鬼,被看作与上帝的力量相对的邪恶、黑暗之源。
简单的说Satan是破坏神,就是进程的异常退出、kill等;God是守护神,保护进程、重启进程等。
一图胜千言,pm2的 RPC基本框架。Client与Daemon是采用了RPC进行通讯。
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
1. Client启动关联Daemon
daemon.innerStart(function() {
KMDaemon.launchAndInteract(that.conf, {
machine_name : that.machine_name,
public_key : that.public_key,
secret_key : that.secret_key
}, function(err, data, interactor_proc) {
that.interactor_process = interactor_proc;
});
that.launchRPC(function(err, meta) {
return cb(null, {
daemon_mode : that.conf.daemon_mode,
new_pm2_instance : false,
rpc_socket_file : that.rpc_socket_file,
pub_socket_file : that.pub_socket_file,
pm2_home : that.pm2_home
});
});
});
child.once(‘message’, function(msg) {
debug(‘PM2 daemon launched with return message: ‘, msg);
child.removeListener(‘error’, onError);
child.disconnect();
if (opts && opts.interactor == false)
return cb(null, child);
/**
* Here the Keymetrics agent is launched automaticcaly if
* it has been already configured before (via pm2 link)
*/
KMDaemon.launchAndInteract(that.conf, {
machine_name : that.machine_name,
public_key : that.public_key,
secret_key : that.secret_key
}, function(err, data, interactor_proc) {
that.interactor_process = interactor_proc;
return cb(null, child);
});
});
2. Daemon有start,stop,close,kill进程的方法,与God的事件发射器(EventEmitter)关联
God.bus.on(‘axm:monitor’, function axmMonitor(msg) {
if (!msg.process)
return console.error(‘[axm:monitor] no process defined’);
if (!msg.process || !God.clusters_db[msg.process.pm_id])
return console.error(‘Unknown id %s’, msg.process.pm_id);
util._extend(God.clusters_db[msg.process.pm_id].pm2_env.axm_monitor, Utility.clone(msg.data));
msg = null;
});
3. Satan.js
3.1. Ping进程是否活着或者关闭
Satan.pingDaemon = function pingDaemon(cb) {
var req = axon.socket(‘req’);
var client = new rpc.Client(req);
debug(‘[PING PM2] Trying to connect to server’);
client.sock.once(‘reconnect attempt’, function() {
client.sock.close();
debug(‘Daemon not launched’);
process.nextTick(function() {
return cb(false);
});
});
client.sock.once(‘connect’, function() {
client.sock.once(‘close’, function() {
return cb(true);
});
client.sock.close();
debug(‘Daemon alive’);
});
req.connect(cst.DAEMON_RPC_PORT);
};
3.2. 通知God
Satan.notifyGod = function(action_name, id, cb) {
Satan.executeRemote(‘notifyByProcessId’, {
id : id,
action_name : action_name,
manually : true
}, function() {
debug(‘God notified’);
return cb ? cb() : false;
});
};
4. God是事件监听
var God = module.exports = {
next_id : 0,
clusters_db : {},
bus : new EventEmitter2({
wildcard: true,
delimiter: ‘:’,
maxListeners: 1000
})
};
5. God的监听进程方法有
God.ping
God.notifyKillPM2
God.duplicateProcessId
God.startProcessId
God.stopProcessId
God.resetMetaProcessId
God.deleteProcessId
God.restartProcessId
God.restartProcessName
God.sendSignalToProcessId
God.sendSignalToProcessName
God.stopWatch
God.toggleWatch
God.startWatch
God.reloadLogs
God.sendDataToProcessId
God.msgProcess
God.getVersion
6. God的进程运行模式用两种
6.1. Cluster集群模式
6.2. Fork模式
一般开发环境用fork模式,生产环境使用cluster模式
简单pm2进程管理描述,更多方法请阅读源码。
wxgzh:ludong86
相关推荐
微信小程序demo:todo:wx.setStorageSync(KEY,DATA) 方法存放数据(源代码+截图)微信小程序demo:todo:wx.setStorageSync(KEY,DATA) 方法存放数据(源代码+截图)微信小程序demo:todo:wx.setStorageSync(KEY,DATA) ...
去做 todo是一个自托管的todo网络应用程序,可让您以简单而最少的方式跟踪待办事项。 :memo:屏幕截图北方主题 德古拉主题 在下面的“预设颜色主题”部分中查看所有主题演示版还有一个公共演示实例,为: ://todo....
bbs.cncsol.com 1。0。0。0版本 应用程序
"todo:CLI个人助理"是一款基于命令行界面(CLI)的个人任务管理工具,它旨在提升用户在终端中的工作效率,让任务管理变得更加便捷。这款工具使用JavaScript编程语言编写,这表明开发者利用了JavaScript的灵活性和跨...
用法查看待办事项清单: todo更改名称: todo -n Things to Do要添加新任务: todo buy milktodo "eat cookies"todo 1 pour milk要编辑任务: todo -e 2 buy more milk移动任务: todo -m 3 2标记任务: todo 1删除...
Chrome Todo 是一个基于Chrome网络浏览器的开源插件,它为用户提供了离线待办事项管理功能。这个插件的设计目标是帮助用户在浏览器环境中高效地组织和跟踪他们的任务,无论他们是否在线。作为开源软件,它的源代码可...
SmartTodo是一个库,旨在根据您的代码库中编写的TODO注释分配用户,并在需要提交给他们的TODO时提醒被分配者。 安装 将宝石添加到您的Gemfile中。 group :development do gem 'smart_todo' , require : false # No...
绝对对得起10分 void CrotaeeDlg::... RotateScreen(2); // TODO: 在此添加控件通知处理程序代码 } void CrotaeeDlg::OnBnClickedButtonRot270() { // TODO: 在此添加控件通知处理程序代码 RotateScreen(4); }
一个用于读取和写入TODO文件的命令行界面。 用法 todo [action] [flags*] [-k key] [-f filename] ... actions -h, --help show this message -l, --ls, --list list tasks -a, --add add a task -e, --edit ...
简单的bash TODO列表管理器,支持特定于目录的TODO列表,推送/弹出和行号。 安装 将以下行添加到~/.bashrc文件中(根据需要更改路径)。 if [ -f path/to/TODO.todo.sh ] ; then . path/to/TODO.todo.sh fi 这将...
伍多多 该项目是使用版本11.0.2生成的。 开发服务器 为开发服务器运行ng serve 。...运行ng e2e通过执行端到端测试。 进一步的帮助 要获得有关Angular CLI的更多帮助,请使用ng help或查看“ 页面。
Todo列表可直接通过chrome通过Microsoft Todo(Microsoft Task)Access和Manager Microsoft Todo:trade_mark:与其他设备同步。 提供与Microsoft Todo:trade_mark:的接口。 主要功能:-从Chrome快速访问任务。 -能够...
actix_todo:在渲染器上部署的Actix Todo示例
React-Todo是一个基于React框架构建的基本待办事项应用示例,它主要展示了如何利用`useReducer`钩子来管理组件状态。在这个应用中,开发者可以添加、编辑和删除待办事项,体验React的状态管理和生命周期管理。 在...
Go-astitodo 的工作原理是利用 Go 语言的抽象语法树(AST,Abstract Syntax Tree)。在编译时,Go 编译器会将源代码转换为 AST,这是一种结构化的数据表示,包含了代码的所有语法元素。Go-astitodo 遍历 AST,查找...
在本项目"typescript-todo"中,我们主要探讨如何利用TypeScript这个强大的静态类型语言来实现CRUD(创建、读取、更新、删除)操作。TypeScript是JavaScript的一个超集,它提供了丰富的类型系统和现代化的编程特性,...
去做待办事项:写一个宝石描述安装将此行添加到应用程序的 Gemfile 中: gem 'todo'然后执行: $ bundle或者自己安装: $ gem install todo用法TODO:在这里写使用说明贡献分叉它( ) 创建您的功能分支( git ...
这包括学习路由、数据库交互、ActiveRecord(ORM)、视图模板系统以及控制器的工作原理。 相关知识点: 1. **Ruby语言**:Ruby是一种动态、面向对象的脚本语言,以其简洁、清晰的语法和强调程序员生产力而著名。在...
基本用法一个简单的工作流程脚本如下所示: name: "Workflow"on: ["pull_request"]jobs: build: runs-on: "ubuntu-latest" steps: - uses: "actions/checkout@v2" - name: "Verify TODOs" uses: "nirinchev/verify-...
使用git todo为每个 git 分支维护一个待办事项列表。 切换分支,使用git todo查看当前分支的待办事项列表。 就那么简单。 警告:这可能会破坏一切并毁掉你的生活。 使用自制软件安装: brew install ...