PM2 进程管理工具

PM2是Node.js的进程管理工具,利用它可以非常容易地实现开机应用自动启动以及必要时自动启动的功能。

我们可以使用 pm2 来守护进程

以下示例采用node-red来演示。

[alick@devnet ~]# sudo npm install -g pm2

然后我们启动 node-red 

[alick@devnet ~]# pm2 start node-red

                        -------------

__/\\\\\\\\\\\\\____/\\\\____________/\\\\____/\\\\\\\\\_____
 _\/\\\/////////\\\_\/\\\\\\________/\\\\\\__/\\\///////\\\___
  _\/\\\_______\/\\\_\/\\\//\\\____/\\\//\\\_\///______\//\\\__
   _\/\\\\\\\\\\\\\/__\/\\\\///\\\/\\\/_\/\\\___________/\\\/___
    _\/\\\/////////____\/\\\__\///\\\/___\/\\\________/\\\//_____
     _\/\\\_____________\/\\\____\///_____\/\\\_____/\\\//________
      _\/\\\_____________\/\\\_____________\/\\\___/\\\/___________
       _\/\\\_____________\/\\\_____________\/\\\__/\\\\\\\\\\\\\\\_
        _\///______________\///______________\///__\///////////////__


                          Runtime Edition

        PM2 is a Production Process Manager for Node.js applications
                     with a built-in Load Balancer.

                Start and Daemonize any application:
                $ pm2 start app.js

                Load Balance 4 instances of api.js:
                $ pm2 start api.js -i 4

                Monitor in production:
                $ pm2 monitor

                Make pm2 auto-boot at server restart:
                $ pm2 startup

                To go further checkout:
                http://pm2.io/


                        -------------

[PM2] Spawning PM2 daemon with pm2_home=/root/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /usr/bin/node-red in fork_mode (1 instance)
[PM2] Done.
┌─────┬─────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name        │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼─────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ node-red    │ default     │ N/A     │ fork    │ 24229    │ 0s     │ 0    │ online    │ 0%       │ 13.5mb   │ root     │ disabled │
└─────┴─────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

重启所有 ProcessId

[alick@devnet ~]# pm2 restart all
Use --update-env to update environment variables
[PM2] Applying action restartProcessId on app [all](ids: [ 0 ])
[PM2] [node-red](0) ✓
┌─────┬─────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name        │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼─────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ node-red    │ default     │ N/A     │ fork    │ 24257    │ 0s     │ 1    │ online    │ 0%       │ 13.2mb   │ root     │ disabled │
└─────┴─────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘

查看 node-red 相关系统信息如下:

[alick@devnet ~]# pm2 info node-red
 Describing process with id 0 - name node-red 
┌───────────────────┬────────────────────────────────────┐
│ status            │ online                             │
│ name              │ node-red                           │
│ namespacedefault                            │
│ version           │ N/A                                │
│ restarts          │ 1                                  │
│ uptime            │ 64s                                │
│ script path       │ /usr/bin/node-red                  │
│ script args       │ N/A                                │
│ error log path    │ /root/.pm2/logs/node-red-error.log │
│ out log path      │ /root/.pm2/logs/node-red-out.log   │
│ pid path          │ /root/.pm2/pids/node-red-0.pid     │
│ interpreter       │ node                               │
│ interpreter args  │ N/A                                │
│ script id         │ 0                                  │
│ exec cwd          │ /root                              │
│ exec mode         │ fork_mode                          │
│ node.js version   │ 14.5.0                             │
│ node env          │ N/A                                │
│ watch & reload    │ ✘                                  │
│ unstable restarts │ 0                                  │
│ created at        │ 2020-07-09T10:38:40.795Z           │
└───────────────────┴────────────────────────────────────┘
 Actions available 
┌────────────────────────┐
│ km:heapdump            │
│ km:cpu:profiling:start │
│ km:cpu:profiling:stop  │
│ km:heap:sampling:start │
│ km:heap:sampling:stop  │
└────────────────────────┘
 Trigger via: pm2 trigger node-red <action_name>

 Code metrics value 
┌────────────────────────┬───────────┐
│ Heap Size              │ 26.41 MiB │
│ Heap Usage             │ 93.64 %   │
│ Used Heap Size         │ 24.73 MiB │
│ Active requests        │ 0         │
│ Active handles         │ 4         │
│ Event Loop Latency     │ 0.45 ms   │
│ Event Loop Latency p95 │ 1.55 ms   │
└────────────────────────┴───────────┘
 Divergent env variables from local env 


 Add your own code metrics: http://bit.ly/code-metrics
 Use `pm2 logs node-red [--lines 1000]` to display logs
 Use `pm2 env 0` to display environment variables
 Use `pm2 monit` to monitor CPU and Memory usage node-red

查看 node-red 相关日志信息如下:

[alick@devnet ~]# pm2 logs node-red
[TAILING] Tailing last 15 lines for [node-red] process (change the value with --lines option)
/root/.pm2/logs/node-red-error.log last 15 lines:
/root/.pm2/logs/node-red-out.log last 15 lines:
0|node-red | ---------------------------------------------------------------------
0|node-red | Your flow credentials file is encrypted using a system-generated key.
0|node-red | 
0|node-red | If the system-generated key is lost for any reason, your credentials
0|node-red | file will not be recoverable, you will have to delete it and re-enter
0|node-red | your credentials.
0|node-red | 
0|node-red | You should set your own key using the 'credentialSecret' option in
0|node-red | your settings file. Node-RED will then re-encrypt your credentials
0|node-red | file using your chosen key the next time you deploy a change.
0|node-red | ---------------------------------------------------------------------
0|node-red | 
0|node-red | 9 Jul 18:38:45 - [info] Starting flows
0|node-red | 9 Jul 18:38:45 - [info] Started flows
0|node-red | 9 Jul 18:38:45 - [info] Server now running at http://127.0.0.1:1880/

保存现在的 process 信息然后,设置为开机启动

[alick@devnet ~]# pm2 save
[PM2] Saving current process list...
[PM2] Successfully saved in /root/.pm2/dump.pm2

[alick@devnet ~]# pm2 startup
[PM2] Init System found: systemd
Platform systemd
Template
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

[Service]
Type=forking
User=root
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/root/.pm2
PIDFile=/root/.pm2/pm2.pid
Restart=on-failure

ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target

Target path
/etc/systemd/system/pm2-root.service
Command list
[ 'systemctl enable pm2-root' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-root.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-root...
Created symlink from /etc/systemd/system/multi-user.target.wants/pm2-root.service to /etc/systemd/system/pm2-root.service.
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via:
$ pm2 save

[PM2] Remove init script via:
$ pm2 unstartup systemd

访问浏览器界面,我们可以通过 1880 端口来正常访问 Node-RED 了。

posted @ 2021-03-31 16:56  airoot  阅读(1514)  评论(0编辑  收藏  举报