前言
上一篇我们部署 Twikoo
之后,发现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~