【PM2工具在windows下对C++程序进行进程管理和日志管理】

【PM2工具在windows下对C++程序进行进程管理和日志管理】,第1张


前言

本篇记录了使用PM2工具在windows下对C++程序进行进程管理和日志管理,主要使用pm2的这两项功能

  • pm2工收集程序的控制台输出,并将其记录为日志的功能 ;
  • pm2-logrotate具有日志轮换,日志压缩的功能;

主要步骤涉及以下内容:

  • nodejs包管理器的安装,
  • pm2的安装,
  • pm2启动脚本的编写,
  • pm2-logrotate的安装,
  • windows下日志轮换不生效,
  • pm2-logrotate配置文件的修改

未解决的问题:
pm2守护C++进程时,没有程序的相应界面,在任务管理器的后台进程中能找到相应的进程,不知道有没有方法可以看到界面.

1.安装class="superseo">nodejs

官方下载链接为:https://nodejs.org/zh-cn/,推荐下载LTS版,安装时候,尽量不要安装在系统盘 ,
[如果下载较慢,可下载其他网站上现成的]
下载后直接进行安装即可;
安装后在命令行中,输入npm应该有相应的参数显示,如下图所示

至此,nodejs的包管理器安装成功.


2.安装pm2

使用上一步安装的nodejs包管理器安装pm2,执行以下命令:

npm install pm2 -g
npm install pm2-windows-startup -g
pm2-startup install 

验证是否安装成功,执行:

pm2 -v

3.pm2启动脚本的编写

我的脚本比较简单,命名为myTest.config.js,这个后缀是官方推荐,目前只有守护进程的功能:

module.exports = {
  apps : [
    {
      name: "xxxapp",//进程名,显示在pm2的控制界面上
      script : "D:\LocoPlatform\LocoPlatform.exe",//程序的路径
      // "exec_interpreter": "node", //项目的脚本类型,默认node,可选shell,C++进程好像不能设置这个参数
      // out_file: "logs/XXX_App.log",//日志后边交由rotate工具进行管理
    },
    {
    name: "XXX_App1",
    script : "C:\Users\Administrator\Desktop\timu\XXX123.exe",
    // out_file: "logs/XXX_App1.log",
    }
  ]
}

在这里由脚本守护了两个进程.
其他可能用到的命令:

pm2 stop xxxapp//停止进程
pm2 delete xxxapp//从管理中删除进程

4.pm2-logrotate的安装

在命令行执行以下命令,进行pm2-logrotate的安装:

pm2 install pm2-logrotate

由于pm2-logrotate在windows下的日志轮换参数不生效,需要对源代码进行如下更改
找到C:\Users\Administrator.pm2\modules\pm2-logrotate\node_modules\pm2-logrotate\app.js(我的时在这个路径)
将第65行改为下图即可,原因应该时之前的路径分隔符时linux下的,不支持windows:

function delete_old(file) {
  if (file === "/dev/null") return;
  var fileBaseName = file.substr(0, file.length - 4).split(path.sep).pop() + "__";//这是第65行

5.pm2-logrotate配置文件的修改

windows下pm2-logrotate配置的修改,有的命令会执行不生效,因此尽量不使用命令行设置,打开C:\Users\Administrator.pm2\module_conf.json
修改配置文件如下:

{
    "pm2-logrotate": {
        "max_size": "10K"//日志的大小
        "retain": 5,//日志的数量
        "compress": true,
        "dateFormat": "YYYY-MM-DD_HH-mm-ss",
        "workerInterval": "5",//日志检测的时间间隔
        "rotateInterval": "0 * * * * ? ",
        "rotateModule": true
    },
    "module-db-v2": {
        "pm2-logrotate": {}
    }
}

我理解的日志检测逻辑和分割逻辑为:

  • pm2-logrotate工具会每隔[workerInterval]的时间间隔,去检测日志的大小,若大于[max_size],就会将日志分割;
  • 当系统时间,满足[rotateInterval],也会强制进行日志分割
  • 当日志的数量大于[retain],就会删除旧的日志,ps:脚本中retain参数应该像workerInterval需增加引号,但是我没有加引号也正常使用了;

其他参数:
compress:日志是否压缩;
dateFormat:日志分割时,日志后缀命名增加的时间格式
rotateModule:是否对pm2的其他模块的日志也使用这样的配置
rotateInterval参数满足cron时间表达式的写法

其他的命令:

pm2 restart pm2-logrotate//修改配置文件后,要从pm2中删除应用,并重启日志管理应用,才能生效

6.程序守护及自动启动

编写bat脚本如下,拉起之前写的pm2进程启动脚本,并将其放在windwos的自启动目录下:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
@echo off 
start cmd.exe /k "pm2 start C:\Users\Administrator\Desktop\timu\myTest.config.js"
Pause

日志的默认生成目录为:

C:\Users\Administrator\.pm2\logs
总结

pm2进行windows进程管理主要的坑就是日志轮换中搜索得比较久.
pm2-logrotate修改配置文件后,要从pm2中删除应用(即使用pm2 delete xxx命令),并重启日志管理应用,才能生效

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/662733.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-18
下一篇 2022-04-18

发表评论

登录后才能评论

评论列表(0条)

保存