13397158231   jevian_ma@worldflying.cn

windows下结合pm2实现多个node程序管理

2019-11-15 22:39:46

pm2是一个很强大的运行管理工具,他可以将程序的标准输出打印到文件中,还可以监控程序运行状况,唯一的缺点是log不带滚动功能。

而官方推荐的pm2-logrotate本身也存在bug。好在pm2提供了reloadLog命令能让log文件更新,利用这里点。我写了一个syslog专门用于备份log,同时,及时调用pm2 reloadLog命令,由于是nodejs代码,所以同时支持windows与linux两套系统。

const { exec } = require('child_process')
const fs = require("fs");

const processlist = ["run"]
const logpath = 'logs/'
const logsize = 512*1024
const lognum = 30
const workinterval = 30

function getfilesize (filepath) {
    return new Promise (function (resolve, reject) {
        fs.stat(filepath, function(err, stats) {
            if (err) {
                resolve (0)
                return
            }
            resolve (stats.size)
        })
    })
}

function unlink (filepath) {
    return new Promise (function (resolve, reject) {
        fs.unlink(filepath, function(err) {
            resolve ()
        })
    })
}

function rename (oldpath, newpath) {
    return new Promise (function (resolve, reject) {
        fs.rename(oldpath, newpath, function(err) {
            resolve ()
        })
    })
}

async function main () {
    let needreload = false
    for (let i = 0, len = processlist.length ; i < len ; i++) {
        let proclog = logpath + processlist[i]
        let size = await getfilesize (proclog + '-out.log')
        if (size > logsize) {
            needreload = true
            await unlink (proclog + '-out' + lognum + '.log')
            let j = lognum
            while (j > 0) {
                let k = j - 1
                await rename (proclog + '-out' + k + '.log', proclog + '-out' + j + '.log')
                j = k
            }
            await rename (proclog + '-out.log', proclog + '-out0.log')
        }
        size = await getfilesize (proclog + '-error.log')
        if (size > logsize) {
            needreload = true
            let j = lognum
            while (j > 0) {
                let k = j - 1
                await rename (proclog + '-error' + k + '.log', proclog + '-error' + j + '.log')
                j = k
            }
            await rename (proclog + '-error.log', proclog + '-error0.log')
        }
    }
    if (needreload) {
        exec ('pm2 reloadLogs', function () {})
    }
}

main ()
setInterval (function () {
    main ()
}, workinterval*1000)


文章作者:沃航科技

优秀产品推荐:可编程网络IO控制器

上一篇:支付宝使用openssl生成不对称加密证书

下一篇:本地电脑使用阿里云作为samba服务器实现文件云存储与云编辑

联系我们

  • 地址:武汉市东湖高新开发区光谷总部国际1栋2412室
  • QQ:932773931
  • 电话:027-59761089-806
  • 手机:13397158231
  • 邮箱:jevian_ma@worldflying.cn

关注公众号

扫码添加微信

沃航(武汉)科技有限公司版权所有

备案号:鄂ICP备16014230号-1

本网站由提供CDN加速/云存储服务