进程管理工具之PM2
Github地址 https://github.com/Unitech/pm2
官方文档 http://pm2.keymetrics.io/docs/usage/quick-start/
安装)
npm install -g pm2
pm2是守护nodejs进程后台运行的,异常停止后可以自动重启,并且也可以袒护其它第三方的命令行程序,比如php的命令行
{ "name": "应用进程名称", "args": "传递给脚本的参数", "script": "启动的脚本路径", "exec_interpreter": "指定的脚本解释器", "exec_mode": "fork", "max_memory_restart": "100M", //其它参数 "watch": [ // 监控变化的目录,一旦变化,自动重启 "bin", "routers" ], "ignore_watch" : [ // 从监控目录中排除 "node_modules", "logs", "public" ], "watch_options": { "followSymlinks": false }, "error_file" : "./logs/app-err.log", // 错误日志路径 "out_file" : "./logs/app-out.log", // 普通日志路径 "env": { "NODE_ENV": "production" // 环境参数,当前指定为生产环境 } }
-
name 脚本显示名称
-
args 脚本参数
-
script 脚本文件名称
-
exec_interpreter 使用的解析器
-
exec_mode 启动模式,fork为使用子进程启动,cluster 使用nodejs的cluster模块启动
-
max_memory_restart 进程占用内存超过时自动重启
使用示例
后台运行一个php的socket程序,需要一直运行,所以需要使用pm2来守护进程
创建一个socket.json的配置文件,里面是数组格式可以启动多个
[{ "name": "php-socket", "args": "", "script": "./include/Socket.php", "exec_interpreter": "php.exe", "exec_mode": "fork", "max_memory_restart": "100M" }]
启动一个django服务
{ "name": "service1", "script": "/data/www/env/bin/python", # 虚拟环境python路径 "args": [ "manage.py", "runserver", "0.0.0.0:8004" ], "exec_interpreter": "", "exec_mode": "fork" }
带有环境变量的django服务:
{ "name": "h5", "script": "/opt/h5/manage.py", "args": [ "runserver", "0.0.0.0:8000",
"--settings=settings.dev"
], "exec_interpreter": "/opt/h5/env/bin/python", "exec_mode": "fork", "error_file": "/opt/h5/logs/h5_err.log", "out_file": "/opt/h5/logs/h5_out.log", "env": { } }
然后cmd到当前目录执行
pm2 start socket.json
启动Vue项目:
pm2 start npm -- run dev
使用配置文件:
{ "name": "router", "script": "/data/www/router", "interpreter": "/opt/rh/rh-nodejs12/root/usr/bin/npm", "interpreter_args": "run build", "exec_mode": "fork", "error_file": "./router-err.log", "out_file": "./router-out.log" }
常用命令:
$ pm2 start app.js -i 4 #后台运行pm2,启动4个app.js # 也可以把'max' 参数传递给 start # 正确的进程数目依赖于Cpu的核心数目 $ pm2 start app.js --name my-api # 命名进程 $ pm2 list # 显示所有进程状态 $ pm2 monit # 监视所有进程 $ pm2 logs # 显示所有进程日志 $ pm2 stop all # 停止所有进程 $ pm2 restart all # 重启所有进程 $ pm2 reload all # 0秒停机重载进程 (用于 NETWORKED 进程) $ pm2 stop 0 # 停止指定的进程 $ pm2 restart 0 # 重启指定的进程 $ pm2 startup # 产生 init 脚本 保持进程活着(pm2 开机启动) $ pm2 web # 运行健壮的 computer API endpoint $ pm2 delete 0 # 杀死指定的进程 $ pm2 delete all # 杀死全部进程 运行进程的不同方式: $ pm2 start app.js -i max # 根据有效CPU数目启动最大进程数目 $ pm2 start app.js -i 3 # 启动3个进程 $ pm2 start app.js -x #用fork模式启动 app.js 而不是使用 cluster $ pm2 start app.js -x -- -a 23 # 用fork模式启动 app.js 并且传递参数 (-a 23) $ pm2 start app.js --name serverone # 启动一个进程并把它命名为 serverone $ pm2 stop serverone # 停止 serverone 进程 $ pm2 start app.json # 启动进程, 在 app.json里设置选项 $ pm2 start app.js -i max -- -a 23 #在--之后给 app.js 传递参数 $ pm2 start app.js -i max -e err.log -o out.log # 启动 并 生成一个配置文件 你也可以执行用其他语言编写的app ( fork 模式): $ pm2 start my-bash-script.sh -x --interpreter bash $ pm2 start my-python-script.py -x --interpreter python
清除(pm2 flush)与重载日志(pm2 reloadLogs
)
配置说明:
name 应用名称; script 启动脚本路径; cwd 应用启动的路径; args 传递给脚本的参数; interpreter 指定的脚本解释器; interpreter_args 传递给解释器的参数; instances 应用启动实例个数,仅在cluster模式有效,默认为fork; exec_mode 应用启动模式,支持fork和cluster模式; watch 监听重启,启用情况下,文件夹或子文件夹下变化应用自动重启; ignore_watch 忽略监听的文件夹,支持正则表达式; max_memory_restart 最大内存限制数,超出自动重启; env 环境变量,object类型,如{"NODE_ENV":"production", "ID": "42"}; log_date_format 指定日志日期格式,如YYYY-MM-DD HH:mm:ss; error_file 记录标准错误流,$HOME/.pm2/logs/XXXerr.log),代码错误可在此文件查找; out_file 记录标准输出流,$HOME/.pm2/logs/XXXout.log),如应用打印大量的标准输出,会导致pm2日志过大; min_uptime 应用运行少于时间被认为是异常启动; max_restarts 最大异常重启次数,即小于min_uptime运行时间重启次数; autorestart 默认为true, 发生异常的情况下自动重启; cron_restart crontab时间格式重启应用,目前只支持cluster模式; force 默认false,如果true,可以重复启动一个脚本。pm2不建议这么做; restart_delay 异常重启情况下,延时重启时间;
日志管理:
pm2 install pm2-logrotate
使用pm2-logrotate进行日志管理使得我们的node服务的log以及pm2的log能够得到控制,防止log过多导致把磁盘刷爆。pm2-logrotate
pm2 set pm2-logrotate:rotateInterval '0 0 */1 * *' //每天零点备份 pm2 set pm2-logrotate:compress true //压缩 pm2 set pm2-logrotate:retain 3 //备份最多3份,也就是备份最进3小时的日志
设置开机启动:
执行命令:
pm2 startup
最终加入到服务的启动服务中, /etc/systemd/system/pm2-boot.service
保存进程列表
pm2 save
解除开启启动
pm2 unstartup systemd
问题点:
1.使用start启动一个json文件之后,如果文件发生了变化 使之生效 需要执行重载命令
pm2 startOrReload pm2_server.json