pm2

Posted on July 13, 2014

安装

控制

  • pm2 start app.js --name my-api -i max -- -a 23

    执行文件必须是js扩展名-i参数才有效(why?)

    max是要启动的进程数量, -i 0 表示启动和cpu核数相同的进程数, 如果是负数, 代表cpu 核数减去该数字绝对值

    --后的参数用于传递给执行脚本

    -x 使用fork模式, 默认是cluster模式

    -e err.log -o out.log

    --node-args="--debug=7001 --trace-deprecation" node 参数(?)

  • pm2 delete id/all/app_name online的也会被干掉

    删除指定的name的进程, 如果是一个name多进程, 一起删除

  • pm2 stop id/all/app_name stop 停止进程, 但是进程还在

    停止指定的name的进程, 如果是一个name多进程, 一起停止

  • pm2 restart id/all/app_name kills and restart,会重新加载代码, 但因为需要kill, 所以服务会中断

  • pm2 reload all/app_name 会算在restart次数中, 类似于平滑重启, Will 0s downtime reload 不过测试来看经常不成功

  • pm2 gracefulReload all/app_name

  • pm2 dump pm2 save 保存进程

  • pm2 kill kill daemon, 守护进程被干掉, 但是执行任意pm2命令后, (只有)守护进程会起来

  • hard restart:

    pm2 dump
    some thing wrong....用pm2 kill来模拟
    pm2 resurrect
    

startup

  • pm2 startup ubuntu

    PM2 You have to run this command as root
    PM2 Execute the following command :
    PM2 sudo env PATH=$PATH:/usr/local/bin pm2 startup ubuntu -u zhonghua
    
  • ubuntu sudo env PATH=$PATH:/usr/local/bin pm2 startup ubuntu -u zhonghua

    PM2 Generating system init script in /etc/init.d/pm2-init.sh
    PM2 Making script booting at startup...
    PM2 -ubuntu- Using the command su -c "chmod +x /etc/init.d/pm2-init.sh && update-rc.d pm2-init.sh defaults"
     Adding system startup for /etc/init.d/pm2-init.sh ...
       /etc/rc0.d/K20pm2-init.sh -> ../init.d/pm2-init.sh
       /etc/rc1.d/K20pm2-init.sh -> ../init.d/pm2-init.sh
       /etc/rc6.d/K20pm2-init.sh -> ../init.d/pm2-init.sh
       /etc/rc2.d/S20pm2-init.sh -> ../init.d/pm2-init.sh
       /etc/rc3.d/S20pm2-init.sh -> ../init.d/pm2-init.sh
       /etc/rc4.d/S20pm2-init.sh -> ../init.d/pm2-init.sh
       /etc/rc5.d/S20pm2-init.sh -> ../init.d/pm2-init.sh
    
    PM2 Done.
    

    centos sudo env PATH=$PATH:/usr/bin pm2 startup centos -u webuser

    PM2 Generating system init script in /etc/init.d/pm2-init.sh
    PM2 Making script booting at startup...
    /var/lock/subsys/pm2-init.sh lockfile has been added
    PM2 -centos- Using the command su -c "chmod +x /etc/init.d/pm2-init.sh; chkconfig --add pm2-init.sh"
    
    PM2 Done.
    
  • pm2 save 进程信息被保存, 下次重启自动启动

    PM2 Dumping processes
    

监控

  • pm2 list [list|ls|l|status]

  • pm2 monit pm2 m

  • pm2 desc id/app_name 注意id是pm中的id序号, 而不是pid

  • pm2 web Launching web interface on port 9615

  • pm2 show ID pm2 desc ID

    可以展示出应用信息, (git)版本控制信息, 探针信息(Probes value):

    • Loop delay:
    • HTTP:
    • pmx:http:latency:

日志

  • pm2 logs [id/app_name] 不带参数应该是all

  • pm2 flush 删除所有日志, 日志文件默认在~/.pm2/logs/, 命令按照#{appname}-#{out/err}-#{id}.log

  • pm2 reloadLogs 通过信号SIGUSR2让已经打开的日志窗口重启

部署

  • pm2 ecosystem 本地生成ecosystem.json ?这种方式如何启动多进程?

  • pm2 start ecosystem.json 本地启动

    pm2 restart ecosystem.json 本地重启

  • pm2 gracefulReload [all|name]

    process.on('message', function(msg) {
      if (msg === 'shutdown') {
        // Your process is going to be reloaded
        // You have to close all database/socket.io/* connections
    
        console.log('Closing all connections...');
        server.close(function () {
          console.log('Finished closing connections');
          process.exit(0);
        });
      }
    });
    
  • pm2 deploy ecosystem.json production setup 本地执行, 会在远程创建current shared source 其中 current 连接到source, 是版本库所在位置

    在这步之前要确保ssh key是通的

    $ ssh-keygen -t rsa
    $ ssh-copy-id [email protected]
    
  • pm2 deploy production 本地版本库要保持干净, 对于远程online的情况,修改了ecosystem进程配置无效, 如instances等, 因为默认是执行startOrRestart

  • pm2 deploy production exec "pm2 restart all" 执行远程命令, 实时反馈刷新

  • pm2 deploy <configuration_file> <environment> update 更新并重启

  • pm2 deploy <configuration_file> <environment> list 更新历史对应的commit

  • pm2 deploy <configuration_file> <environment> revert [n] n默认是1, 会重启, 会修改更新list(添加上一个更新到最新)

  • pm2 deploy <configuration_file> <environment> curr[ent] 回显当前的更新commit

  • pm2 deploy <configuration_file> <environment> prev[ious] 回显之前一个更新commit

集群

项目设计一定要符合stateless

  • Sessions must not be stored in memory but shared via a database (Redis, Mongo, whatever)
  • WebSocket/Socket.io should communicate via a database

  • 动态增删集群数量: pm2 scale <app name> <n>

    pm2 scale app +3 增加3个

    pm2 scale app 2 减少2个

  • process.env.NODE_APP_INSTANCE 集群模式下自动设置的环境变量, 从0开始, 各个进程递增, 对于scale增加的进程, 也是从0开始

更新

如果是使用root, 需要 sudo npm install pm2 -g --unsafe-perm 然后更新内存里的pm2: pm2 updatePM2


参考