jackieli123723 / jackieli123723.github.io

✅lilidong 个人博客
9 stars 0 forks source link

多核多线程的解决方案 pm2 自启动脚本编写 #28

Open jackieli123723 opened 6 years ago

jackieli123723 commented 6 years ago

pm2简介

常用命令一般就是:

pm2 start app.js  
pm2 reload all  
pm2 list  
pm2 monit   
pm2 logs  
pm2 delete all  
pm2 startup  
pm2 save

其实有上面的列表就足够,便于大家参考,列一下cli大全

<span style="font-family:SimSun;"># General  
$ npm install pm2 -g            # Install PM2  
$ pm2 start app.js              # Start, Daemonize and auto-restart application (Node)  
$ pm2 start app.py              # Start, Daemonize and auto-restart application (Python)  
$ pm2 start npm -- start        # Start, Daemonize and auto-restart Node application  
  
# Cluster Mode (Node.js only)  
$ pm2 start app.js -i 4         # Start 4 instances of application in cluster mode  
                                # it will load balance network queries to each app  
$ pm2 reload all                # Zero Second Downtime Reload  
$ pm2 scale [app-name] 10       # Scale Cluster app to 10 process  
  
# Process Monitoring  
$ pm2 list                      # List all processes started with PM2  
$ pm2 monit                     # Display memory and cpu usage of each app  
$ pm2 show [app-name]           # Show all informations about application  
  
# Log management  
$ pm2 logs                      # Display logs of all apps  
$ pm2 logs [app-name]           # Display logs for a specific app  
$ pm2 logs --json               # Logs in JSON format  
$ pm2 flush  
$ pm2 reloadLogs  
  
# Process State Management  
$ pm2 start app.js --name="api" # Start application and name it "api"  
$ pm2 start app.js -- -a 34     # Start app and pass option "-a 34" as argument  
$ pm2 start app.js --watch      # Restart application on file change  
$ pm2 start script.sh           # Start bash script  
$ pm2 start app.json            # Start all applications declared in app.json  
$ pm2 reset [app-name]          # Reset all counters  
$ pm2 stop all                  # Stop all apps  
$ pm2 stop 0                    # Stop process with id 0  
$ pm2 restart all               # Restart all apps  
$ pm2 gracefulReload all        # Graceful reload all apps in cluster mode  
$ pm2 delete all                # Kill and delete all apps  
$ pm2 delete 0                  # Delete app with id 0  
  
# Startup/Boot management  
$ pm2 startup                   # Detect init system, generate and configure pm2 boot on startup  
$ pm2 save                      # Save current process list  
$ pm2 resurrect                 # Restore previously save processes  
$ pm2 unstartup                 # Disable and remove startup system  
  
$ pm2 update                    # Save processes, kill PM2 and restore processes  
$ pm2 generate                  # Generate a sample json configuration file  
  
# Deployment  
$ pm2 deploy app.json prod setup    # Setup "prod" remote server  
$ pm2 deploy app.json prod          # Update "prod" remote server  
$ pm2 deploy app.json prod revert 2 # Revert "prod" remote server by 2  
  
# Module system  
$ pm2 module:generate [name]    # Generate sample module with name [name]  
$ pm2 install pm2-logrotate     # Install module (here a log rotation system)  
$ pm2 uninstall pm2-logrotate   # Uninstall module  
$ pm2 publish                   # Increment version, git push and npm publish  
</span>

pm2使用

启动程序,2并发,我不说简单的使用了,直接说并发。

pm2 start xxx.js 就能启动你需要的server服务,然后-i 指定多开数量。

[azuo1228@Server Meanjs-MMM]$ pm2 start server.js -i 2
[PM2] Starting /data/webproj/Meanjs-MMM/server.js in cluster_mode (2 instances)
[PM2] Done.
┌──────────┬────┬─────────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
│ App name │ id │ mode  │ pid  │ status │ restart │ uptime │ cpu │ mem    │ watching │
├──────────┼────┼─────────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
│ server  │ 0 │ cluster │ 12711 │ online │ 0    │ 0s   │ 77% │ 27.0 MB  │ disabled │
│ server  │ 1 │ cluster │ 12717 │ online │ 0    │ 0s   │ 66% │ 24.3 MB  │ disabled │
└──────────┴────┴─────────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘

查看程序运行:

[azuo1228@Server Meanjs-MMM]$ pm2 list
┌──────────┬────┬─────────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
│ App name │ id │ mode  │ pid  │ status │ restart │ uptime │ cpu │ mem    │ watching │
├──────────┼────┼─────────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
│ server  │ 0 │ cluster │ 12107 │ online │ 0    │ 16s  │ 0% │ 93.5 MB  │ disabled │
│ server  │ 1 │ cluster │ 12113 │ online │ 0    │ 16s  │ 0% │ 90.4 MB  │ disabled │
└──────────┴────┴─────────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app

查看启用程序后端口侦听

[azuo1228@Server Meanjs-MMM]$ netstat -apn | grep 3000
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp    0   0 0.0.0.0:3000      0.0.0.0:*        LISTEN   11553/PM2 v2.2.2: G
tcp    0   0 127.0.0.1:3000     127.0.0.1:51950     TIME_WAIT  -

停用运行的程序

stop并不能清理程序,也不会释放端口,而是要delete:

[azuo1228@Server Meanjs-MMM]$ pm2 delete all
[PM2] Applying action deleteProcessId on app [all](ids: 0,1)
[PM2] [server](1) ✓
[PM2] [server](0) ✓
┌──────────┬────┬──────┬─────┬────────┬─────────┬────────┬─────┬─────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ watching │
└──────────┴────┴──────┴─────┴────────┴─────────┴────────┴─────┴─────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app

查看detele之后的端口

delete之后,可以看到没有端口在侦听了

[azuo1228@Server Meanjs-MMM]$ netstat -apn | grep 3000
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
[azuo1228@Server Meanjs-MMM]$

其实有人在网上也说了pm2的种种不好,比如stop之后端口没有释放,其实参考官网就知道了,有delete命令的,这里就不多说这个基本的使用了。

这里就先说这么多,以后再说如何建立ecosystem脚本来实现配置,以及pm2 保存任务实现开机重启的原理。

pm2 启动自动

1生成脚本

[azuo1228@Server Meanjs-MMM]$ pm2 ecosystem

会在工程下面生成一个ecosystem.config.js。

2修改脚本

里面有两个供start和deploy的部分,修改如下:

1-这里去掉deploy的部分

2-只是留下一个程序(可以配置多个程序的),分两个env来启动程序

代码如下:

module.exports = {
 /**
  * Application configuration section
  * http://pm2.keymetrics.io/docs/usage/application-declaration/
  */
 apps : [

  // First application
  {
   name   : "TBQSJ",
   instances : 2,
   script  : "server.js",
  exec_mode : "cluster",
   env_dev : {
    NODE_ENV: "development"
   },
   env_prod : {
    NODE_ENV: "production"
   }
  }
 ]
}

注意,这里写的脚本指定的执行文件,无需用绝对路径,因为最后保存save,用来重启的dump文件是一个文本文件,可以看到里面的内容:

204   "pm_exec_path": "/data/webproj/Meanjs-MMM/server.js",
205   "pm_cwd": "/data/webproj/Meanjs-MMM",
206   "exec_interpreter": "node",

设置好了解释器,执行路径,已经程序执行的cwd,这点非常好。

3分env区别运行脚本

里面有两种env,env_dev和env_prod,那么运行的时候,只要指定--env dev或者prod就可以了,不需要前面的env_。

1-dev环境

[azuo1228@Server Meanjs-MMM]$ pm2 start ecosystem.config.js --env dev
[PM2][WARN] Applications TBQSJ not running, starting...
[PM2] App [TBQSJ] launched (2 instances)
┌──────────┬────┬─────────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
│ App name │ id │ mode  │ pid  │ status │ restart │ uptime │ cpu │ mem    │ watching │
├──────────┼────┼─────────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
│ TBQSJ  │ 0 │ cluster │ 22797 │ online │ 0    │ 0s   │ 79% │ 28.2 MB  │ disabled │
│ TBQSJ  │ 1 │ cluster │ 22803 │ online │ 0    │ 0s   │ 66% │ 24.6 MB  │ disabled │
└──────────┴────┴─────────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app
[azuo1228@Server Meanjs-MMM]$ pm2 delete all
[PM2] Applying action deleteProcessId on app [all](ids: 0,1)
[PM2] [TBQSJ](0) ✓
[PM2] [TBQSJ](1) ✓
┌──────────┬────┬──────┬─────┬────────┬─────────┬────────┬─────┬─────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ watching │
└──────────┴────┴──────┴─────┴────────┴─────────┴────────┴─────┴─────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app
[azuo1228@Server Meanjs-MMM]$
[azuo1228@Server Meanjs-MMM]$

2-prod环境

[azuo1228@Server Meanjs-MMM]$ pm2 start ecosystem.config.js --env prod
[PM2][WARN] Applications TBQSJ not running, starting...
[PM2] App [TBQSJ] launched (2 instances)
┌──────────┬────┬─────────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
│ App name │ id │ mode  │ pid  │ status │ restart │ uptime │ cpu │ mem    │ watching │
├──────────┼────┼─────────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
│ TBQSJ  │ 0 │ cluster │ 23243 │ online │ 0    │ 0s   │ 70% │ 27.1 MB  │ disabled │
│ TBQSJ  │ 1 │ cluster │ 23249 │ online │ 0    │ 0s   │ 66% │ 24.2 MB  │ disabled │
└──────────┴────┴─────────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app
[azuo1228@Server Meanjs-MMM]$
[azuo1228@Server Meanjs-MMM]$
[azuo1228@Server Meanjs-MMM]$ pm2 ls
┌──────────┬────┬─────────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
│ App name │ id │ mode  │ pid  │ status │ restart │ uptime │ cpu │ mem    │ watching │
├──────────┼────┼─────────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
│ TBQSJ  │ 0 │ cluster │ 23243 │ online │ 0    │ 5s   │ 0% │ 93.9 MB  │ disabled │
│ TBQSJ  │ 1 │ cluster │ 23249 │ online │ 0    │ 5s   │ 0% │ 88.3 MB  │ disabled │
└──────────┴────┴─────────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘
 Use `pm2 show <id|n

4发现问题

一个app只能以一种环境运行,也就是上面的脚本,一个程序两种环境,其实是无法启用两种环境的,所以需要写两个程序,然后不指定env_xxx,而是指定一个默认的env(就是env字段,不带后缀),这样不同的环境设置不同的env,脚本如下:

[azuo1228@Server Meanjs-MMM]$ cat ecosystem.config.js
module.exports = {
 /**
  * Application configuration section
  * http://pm2.keymetrics.io/docs/usage/application-declaration/
  */
 apps : [

  // First application
  {
   name   : "TBQSJ-Dev",
   instances : 2,
   script  : "server.js",
  exec_mode : "cluster",
   env : {
    NODE_ENV: "development"
   }
  },
  // Second application
  {
   name   : "TBQSJ-Prod",
   instances : 2,
   script  : "server.js",
  exec_mode : "cluster",
   env : {
    NODE_ENV: "production"
   }
  }
 ]
}

设置两个app,都用默认env,但是里面的值不同, 然后启动,一次就是两个app都启动了:

[azuo1228@Server Meanjs-MMM]$ pm2 start ecosystem.config.js
[PM2][WARN] Applications TBQSJ-Dev, TBQSJ-Prod not running, starting...
[PM2] App [TBQSJ-Dev] launched (2 instances)
[PM2] App [TBQSJ-Prod] launched (2 instances)
┌────────────┬────┬─────────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
│ App name  │ id │ mode  │ pid  │ status │ restart │ uptime │ cpu │ mem    │ watching │
├────────────┼────┼─────────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
│ TBQSJ-Dev │ 0 │ cluster │ 24361 │ online │ 0    │ 0s   │ 60% │ 37.7 MB  │ disabled │
│ TBQSJ-Dev │ 2 │ cluster │ 24373 │ online │ 0    │ 0s   │ 36% │ 35.2 MB  │ disabled │
│ TBQSJ-Prod │ 1 │ cluster │ 24362 │ online │ 0    │ 0s   │ 34% │ 33.7 MB  │ disabled │
│ TBQSJ-Prod │ 3 │ cluster │ 24380 │ online │ 0    │ 0s   │ 38% │ 35.1 MB  │ disabled │
└────────────┴────┴─────────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘
 Use `pm2 show <id|name>` to get mo

5保存脚本,重启

pm2 save
sudo reboot

重启之后,可以看到,该运行的程序已经在运行了:

azuo1228 2030 10.4 1.2 1202868 96348 ?    Sl  22:37  0:02 node /data/webproj/Meanjs-MMM/server.js
azuo1228 2036 10.3 1.2 1206392 101564 ?   Sl  22:37  0:02 node /data/webproj/Meanjs-MMM/server.js
azuo1228 2046 10.5 1.2 1202932 98644 ?    Sl  22:37  0:02 node /data/webproj/Meanjs-MMM/server.js
azuo1228 2047 10.4 1.2 1137472 96856 ?    Sl  22:37  0:02 node /data/webproj/Meanjs-MMM/server.js

然后看看pm2 list

[azuo1228@Server ~]$ pm2 ls
┌────────────┬────┬─────────┬──────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
│ App name  │ id │ mode  │ pid │ status │ restart │ uptime │ cpu │ mem    │ watching │
├────────────┼────┼─────────┼──────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
│ TBQSJ-Dev │ 0 │ cluster │ 2030 │ online │ 0    │ 53s  │ 0% │ 61.9 MB  │ disabled │
│ TBQSJ-Dev │ 2 │ cluster │ 2046 │ online │ 0    │ 53s  │ 0% │ 68.0 MB  │ disabled │
│ TBQSJ-Prod │ 1 │ cluster │ 2036 │ online │ 0    │ 53s  │ 0% │ 64.8 MB  │ disabled │
│ TBQSJ-Prod │ 3 │ cluster │ 2047 │ online │ 0    │ 53s  │ 0% │ 63.3 MB  │ disabled │
└────────────┴────┴─────────┴──────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘