您好,欢迎访问沃航(武汉)科技有限公司官方网站
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)


文章作者:沃航科技

联系我们
地址:
武汉市洪山区蓝晶国际7栋903
QQ:
932773931
电话:
027-59761089-806
手机:
13397158231
邮箱:
jevian_ma@worldflying.cn
×
物联网组态平台
试用账号:123456
试用密码:123456
如需测试更多功能或者有疑问可发送邮件至:jevian_ma@worldflying.cn
×
积木编程平台
试用方式:试用手机号码注册即可使用
如需测试更多功能或者有疑问可发送邮件至:jevian_ma@worldflying.cn