PM2实用指南、详解、实现脚本后台运行示例

前言

上一篇我们部署 Twikoo 之后,发现PM2真的还是比较神奇的,这边来简单的学习了解一下。

PM2 GitHub

PM2 官网

安装

npm install -g pm2

启动

pm2 start app.js --watch   #实时监控app.js的方式启动,当app.js文件有变动时,pm2会自动reload
pm2 start app.js -i max  # 根据有效CPU数目启动最大进程数目
pm2 start app.js -n appname -i max -e err.log -o out.log # 以 appname 启动 app.js,错误当前目录 err.log 为 error log,out.log 为输出 log
pm2 start bb.sh  --interpreter bash # 用 bash 执行脚本
pm2 start test.py--interpreter python3 # 用 python 环境执行脚本
  • 启动类似 node xxx.js 的项目

    pm2 start --name xxxsname xxx.js  # 将运行的实例命名为 xxxsname
  • 启动类似 npm start 的项目

    pm2 start --name appname npm -- start # 设置应用名为 appname
  • 启动类似 npm run serve 的项目

    pm2 start --name servename npm -- run serve # 设置应用名为 servename

    --name xxx 或者 -n xxx 表示将应用命名为 xxx

  • 以配置文件的形式启动

    pm2 start pm2config.json

查看 PM2 部署的应用

pm2 list               # 显示所有进程状态
pm2 ls                 # 显示所有进程状态
pm2 show 0             # 显示某个应用的详细信息
pm2 monit              # 监视所有进程
pm2 logs               # 显示所有进程日志
pm2 log 0              # 查看 `0` 应用的日志
pm2 stop all           # 停止所有进程
pm2 restart all        # 重启所有进程
pm2 reload all         # 0秒停机重载进程
pm2 stop 0             # 停止指定的进程,`0` 是应用 id
pm2 restart 0          # 重启指定的进程,`0` 是应用 id
pm2 startup            # 产生 `init` 脚本 保持进程活着,`startup` 是指系统boot, 开机进程自启动
pm2 unstartup          # 禁用开机进程自启动
pm2 delete 0           # 杀死指定的进程,`0` 是应用 id,会删除该应用
pm2 delete all         # 杀死全部进程,会删除所有应用

自定义启动文件

{
  "apps": [{
    "name": "appname",                 # 应用名
    "exec_interpreter": "node",        # 执行环境
    "script": "./b.js",                # 要执行的脚本
    "cwd": "/home/uftp/test-pm2",      # 项目路径
    "exec_mode": "fork",
    "max_memory_restart": "1G",
    "autorestart": true,               # 出错自动重启
    "node_args": [],
    "watch": false,
    "error_file" : "./test-err.log",   # 错误日志文件位置
    "out_file": "./test-out.log",      # 输出日志文件位置
    "pid_file": "./test.pid",          # 进程相关文件位置
    "env": {
       "NODE_ENV": "development"
    },
    "min_uptime": "60s",
    "max_restarts": 30
  }]
}

apps: 是一个数组,数组中的每一个对象表示一个运行中的应用,可以配置多个应用,同时启动

exec_interpreter: 执行环境,node bash python 等等

script: 将要执行的脚本

cwd: 应用的路径

exec_mode: 应用程序启动模式,默认是fork,也可设置cluster_mode

max_memory_restart: 超过这个指定的值之后将会重启应用 1G 500M

autorestart: 出现故障之后是否自动重启,默认 true

watch: 监听文件更改,更改文件之后自动重启

error_file: error log 错误日志

out_file: out log 输出日期

pid_file: 进程文件

min_uptime: 最短的运行时间,如果少于这个时间就退出了,则会触发 max_restarts

max_restarts: 最大重启次数

实践

以启动我的 Hexo 以及 Twikoo 为例:

1. 创建一个 start.json 的文件,内容如下:

{
  "apps": [
  {
    "name": "hexo", 
    "exec_interpreter": "node", 
    "script": "/var/www/yydnas/run-hexo.js", 
    "cwd": "/var/www/yydnas", 
    "exec_mode": "fork",
    "max_memory_restart": "1G",
    "autorestart": true, 
    "node_args": [],
    "watch": false,
    "error_file" : "/var/log/pm2/start-hexo-error.log", 
    "out_file": "/var/log/pm2/start-hexo-out.log",  
    "pid_file": "/var/log/pm2/start-hexo-pid.log", 
    "env": {
       "NODE_ENV": "development"
    },
    "min_uptime": "60s",
    "max_restarts": 30
  },

  {
    "name": "twikoo", 
    "exec_interpreter": "node", 
    "script": "/var/www/yydnas/tkserver/run-tkserver.js", 
    "cwd": "/var/www/yydnas/tkserver", 
    "exec_mode": "fork",
    "max_memory_restart": "1G",
    "autorestart": true, 
    "node_args": [],
    "watch": false,
    "error_file" : "/var/log/pm2/start-twikoo-error.log", 
    "out_file": "/var/log/pm2/start-twikoo-out.log",  
    "pid_file": "/var/log/pm2/start-twikoo-pid.log", 
    "env": {
       "NODE_ENV": "development"
    },
    "min_uptime": "60s",
    "max_restarts": 30
  }
  ]
}

2. 运行

pm2 start start.json

成功运行:

更简单的方法

当然,如果不想每次自己手动启动,也可以依次运行单个脚本后,输入以下命令,每次开机自动启动。

pm2 startup

取消自启动:

pm2 unstartup systemd

总结

当然,两种方法都是比较好的,这个根据个人需求来选择。一直觉得,最终结果不是最重要的,只要的是在过程中学到的东西。

永远都在学习的路上。

Forever Study~

0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
滚动至顶部