用Node.JS写一个简单版的类似pm2\forever的守护进程并记录错误日志


发布者 ourjs  发布时间 1639719872274
关键字 Node.JS 
PM2(Process Manager 2 )是具有内置负载均衡器的Node.js应用程序的生产运行时和进程管理器。 它允许您永久保持应用程序活跃,无需停机即可重新加载它们,并促进常见的Devops任务。

但PM2相对复杂,包比较大,我们其实可以用child_process,实现一个简单版的进程守护程序,在控制台时时看到并保存LOG,0依赖。
 
比如下面的代码自动执行 pro.bat,并记录程序错误日志,当异常退出后,会自动重启服务。

 

const path = require('path');
const fs = require('fs');
const { spawn } = require('child_process');

class Thread {
logDir = 'logs';
restartInterval = 4000;

__thread;

addLog(type, data) {
const date = (new Date()).toISOString();
const msg = date + ' ' + data.toString();
const logPath = path.join(this.logDir, date.substring(0, date.indexOf('T')) + '.' + type + '.log')

console.log(msg);

fs.appendFile(logPath, msg, () => { });
}

logMsg(data) { this.addLog('out', data) }
logErr(data) { this.addLog('err', data) }

init(cmd, args) {
this.logMsg(`Start ${cmd} ${args}`);

const thread = spawn(cmd, args);

thread.stdout.on('data', data => this.logMsg(data));
thread.stderr.on('data', data => this.logErr(data));

thread.on('close', (code) => {
this.logMsg(`Exited with code ${code}, will restart in ${this.restartInterval}`);
setTimeout(()=>{
this.init(cmd, args);
}, this.restartInterval);
});

this.__thread = thread;
}

stop() {
const __process = this.__thread;
if (__process) {
this.__thread = null;
__process.kill();
}
}

constructor(cmd, args) {
fs.mkdir(this.logDir, err => {});
this.init(cmd, args || []);
}
}

const thread = new Thread('deploy.bat');

 









 热门文章 - 分享最多
  1. MongoDB起步入门教程使用Node.JS的Promise方式查找数据
  2. Node.JS连接MySQL数据库执行增删改查提示ER_NOT_SUPPORTED_AUTH_MODE: Client does not support;如何在@mysql/xdevapi执行SQL
  3. NodeJS在Windows上使用OLE/COM/ActiveXObject对象连接ADODB数据库,操作Application.Excel、运行VBA宏并另存为网页
  4. CSS Grid网格入门实例教程: 强大的动态布局
  5. node.js中async/await不用try/catch,使用error first或go语言方法处理异常
  6. 网站集成百度、Bing必应搜索引擎,在网页中实现站内全文搜索
  7. React Hooks入门教程九:在React中集成使用Vue实现数据双向绑定,手动配置Webpack和Babel
  8. node.js性能压力测试入门教程:wrk和loadtest安装使用
  9. JavaScript和node.js内存泄露的原因和避免方法及Chrome调试工具使用教程
  10. Html5网页中用JavaScript调用本地手机摄像头扫描识别微信二维码、条形码:postMessage跨域https传递扫码结果消息

 相关阅读
  1. node.js通过Error.prepareStackTrace获取上层调用函数的文件名地址和行数位置
  2. webpack前端项目调试环境安装入门:webpack.config.js禁用UglifyJs只合并JavaScript不压缩混淆代码
  3. node.js创建aria2代理服务器:使用net.socket转发rpc或http request请求,替换websocket
  4. request停止维护:用node.js实现http网页爬虫抓取,模拟ajax\post请求,大文件上传下载
  5. 用node.js在Windows或Linux平台上高性能解压/压缩zip、tar大文件,输出到文件或Stream流
  6. Node.JS中回调嵌套和async/await执行空函数性能效率对比测试
  7. Node.JS如何按顺序调用async函数,如何判断是否为async函数,在mocha中自动化测试async/await代码
  8. node.js将回调函数嵌套,用promise改造成async/await顺序执行:异常处理和返回多个参数
  9. 基于Node.JS和Electron编写的集成开发环境 VS Code,成为最受欢迎的IDE
  10. 使用node.js和oAuth2协议集成Github/LinkedIn第三方登录以OnceOA模块源码为例

  开源的 OurJS
OurJS开源博客已经迁移到 OnceOA 平台。

  关注我们
扫一扫即可关注我们:
OnceJS

OnceOA