Node.js进程管理器PM2浅析

  作者:zhanhailiang 日期:2014-11-02

PM2是Node.js应用程序的进程管理管理,目前已在生产环境被普遍使用,提供以下特性:

  • Transitional state of apps
  • Process listing
  • Automatic restart process based on memory
  • Monitoring CPU/Memory usage
  • Logs management
  • Clustering
  • Watch & Restart
  • Reloading without downtime
  • Make PM2 restart on server reboot
  • JSON app declaration

详情请见:

接下来介绍PM2的基本使用方法:

1. 安装PM2:

[root@~/wade/git/node-lessons/lesson1]# npm install pm2 -g

2. PM2功能集:

[root@~/wade/git/node-lessons/lesson1]# pm2 -h

  Usage: pm2 [cmd] app

  Commands:

    start [options] <file|json|stdin>
       start and daemonize an app
    
    deploy <file|environment>
       deploy your json
    
    startOrRestart <json>
       start or restart JSON file
    
    startOrReload <json>
       start or gracefully reload JSON file
    
    startOrGracefulReload <json>
       start or gracefully reload JSON file
    
    stop [options] <id|name|all|json|stdin>
       stop a process (to start it again, do pm2 restart <app>)
    
    restart [options] <id|name|all|json|stdin>
       restart a process
    
    reload <name|all>
       reload processes (note that its for app using HTTP/HTTPS)
    
    gracefulReload <name|all>
       gracefully reload a process. Send a "shutdown" message to close all connections.
    
    delete <name|id|script|all|json|stdin>
       stop and delete a process from pm2 process list
    
    sendSignal <signal> <pm2_id|name>
       send a system signal to the target process
    
    ping 
       ping pm2 daemon - if not up it will launch it
    
    updatePM2 
       update in-memory PM2 with local PM2
    
    update 
       (alias) update in-memory PM2 with local PM2
    
    interact [secret_key] [public_key] [machine_name]
       agent actions for keymetrics.io
    
    killInteract 
       stop agent
    
    infoInteract 
       get information about agent
    
    web 
       launch an health API on port 9615
    
    dump 
       dump all processes for resurrecting them later
    
    save 
       (alias) dump all processes for resurrecting them later
    
    resurrect 
       resurrect previously dumped processes
    
    startup <platform>
       auto resurrect process at startup. [platform] = ubuntu, centos, gentoo or systemd
    
    generate 
       generate an ecosystem.json configuration file
    
    ecosystem 
       generate an ecosystem.json configuration file
    
    reset <name|id|all>
       reset counters for process
    
    describe <id>
       describe all parameters of a process id
    
    desc <id>
       describe all parameters of a process id
    
    list 
       list all processes
    
    ls 
       (alias) list all processes
    
    l 
       (alias) list all processes
    
    status 
       (alias) list all processes
    
    jlist 
       list all processes in JSON format
    
    prettylist 
       print json in a prettified JSON
    
    monit 
       launch termcaps monitoring
    
    m 
       (alias) launch termcaps monitoring
    
    flush 
       flush logs
    
    reloadLogs 
       reload all logs
    
    logs [id|name]
       stream logs file. Default stream all logs
    
    ilogs 
       advanced interface to display logs
    
    kill 
       kill daemon
    
    * 
    

  Options:

    -h, --help                           output usage information
    -V, --version                        output the version number
    -v --version                         get version
    -s --silent                          hide all messages
    -m --mini-list                       display a compacted list without formatting
    -f --force                           force actions
    -n --name <name>                     set a <name> for script
    -i --instances <number>              launch [number] instances (for networked app)(load balanced)
    -o --output <path>                   specify out log file
    -e --error <path>                    specify error log file
    -p --pid <pid>                       specify pid file
    --max-memory-restart <memory>        specify max memory amount used to autorestart (in megaoctets)
    --env <environment_name>             specify environment to get specific env variables (for JSON declaration)
    -x --execute-command                 execute a program using fork system
    -u --user <username>                 define user when generating startup script
    -c --cron <cron_pattern>             restart a running process based on a cron pattern
    -w --write                           write configuration in local folder
    --interpreter <interpreter>          the interpreter pm2 should use for executing app (bash, python...)
    --log-date-format <momentjs format>  add custom prefix timestamp to logs
    --no-daemon                          run pm2 daemon in the foreground if it doesn‘t exist already
    --merge-logs                         merge logs from different instances but keep error and out separated
    --watch                              watch application folder for changes
    --node-args <node_args>              space delimited arguments to pass to node in cluster mode - e.g. --node-args="--debug=7001 --trace-deprecation"
    --run-as-user <run_as_user>          The user or uid to run a managed process as
    --run-as-group <run_as_group>        The group or gid to run a managed process as
    --no-color                           skip colors

  Basic Examples:

    Start an app using all CPUs available + set a name :
    $ pm2 start app.js -i max --name "api"

    Restart the previous app launched, by name :
    $ pm2 restart api

    Stop the app :
    $ pm2 stop api

    Restart the app that is stopped :
    $ pm2 restart api

    Remove the app from the process list :
    $ pm2 delete api

    Kill daemon pm2 :
    $ pm2 kill

    Update pm2 :
    $ npm install pm2@latest -g ; pm2 updatePM2

    More examples in https://github.com/Unitech/pm2#usagefeatures

  Deployment help:

    $ pm2 deploy help

3. 使用PM2管理你的第一个Demo:

[root@~/wade/git/node-lessons/lesson1]# pm2 start app.js --name ‘firstapp‘
Starting PM2 daemon...
[PM2] Process app.js launched
┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬─────────────┬─────────────┐
│ App name │ id │ mode │ PID  │ status │ restarted │ uptime │      memory │    watching │
├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼─────────────┼─────────────┤
│ firstapp │ 0  │ fork │ 6616 │ online │         0 │ 0s     │ 11.145 MB   │ unactivated │
└──────────┴────┴──────┴──────┴────────┴───────────┴────────┴─────────────┴─────────────┘
 Use `pm2 desc[ribe] <id>` to get more details
[root@~/wade/git/node-lessons/lesson1]# pm2 list
┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬─────────────┬─────────────┐
│ App name │ id │ mode │ PID  │ status │ restarted │ uptime │      memory │    watching │
├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼─────────────┼─────────────┤
│ firstapp │ 0  │ fork │ 6616 │ online │         0 │ 10s    │ 18.539 MB   │ unactivated │
└──────────┴────┴──────┴──────┴────────┴───────────┴────────┴─────────────┴─────────────┘
 Use `pm2 desc[ribe] <id>` to get more details
^C[root@~/wade/git/node-lessons/lesson1]# pm2 desc firstapp
Describing process with pid 0 - name firstapp
┌───────────────────┬────────────────────────────────────────────┐
│ status            │ online                                     │
│ name              │ firstapp                                   │
│ id0                                          │
│ path              │ /root/wade/git/node-lessons/lesson1/app.js │
│ args              │                                            │
│ exec cwd          │ /root/wade/git/node-lessons/lesson1        │
│ error log path    │ /root/.pm2/logs/firstapp-err-0.log         │
│ out log path      │ /root/.pm2/logs/firstapp-out-0.log         │
│ pid path          │ /root/.pm2/pids/firstapp-0.pid             │
│ mode              │ fork_mode                                  │
│ node v8 arguments │                                            │
│ watch & reload    │ ?                                          │
│ interpreter       │ node                                       │
│ restarts          │ 0                                          │
│ unstable restarts │ 0                                          │
│ uptime            │ 58s                                        │
│ created at        │ 2014-11-02T08:43:36.834Z                   │
└───────────────────┴────────────────────────────────────────────┘
[root@~/wade/git/node-lessons/lesson1]# pm2 stop firstapp
[PM2] Stopping firstapp
[PM2] stopProcessId process id 0
┌──────────┬────┬──────┬──────┬─────────┬───────────┬────────┬────────┬─────────────┐
│ App name │ id │ mode │ PID  │ status  │ restarted │ uptime │ memory │    watching │
├──────────┼────┼──────┼──────┼─────────┼───────────┼────────┼────────┼─────────────┤
│ firstapp │ 0  │ fork │ 6616 │ stopped │         000 B    │ unactivated │
└──────────┴────┴──────┴──────┴─────────┴───────────┴────────┴────────┴─────────────┘
 Use `pm2 desc[ribe] <id>` to get more details
[root@~/wade/git/node-lessons/lesson1]# pm2 kill
[PM2] Stopping PM2...
[PM2] Deleting all process
[PM2] deleteProcessId process id 0
[PM2] All processes has been stopped and deleted
[PM2] PM2 stopped

推荐阅读:

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。