pm2进程管理工具使用总结

知乎地址:https://zhuanlan.zhihu.com/p/58787876

对于后台进程的管理,常用的工具是crontab,可用于两种场景:定时任务和常驻脚本。关于常驻脚本,今天介绍一款更好用的工具:pm2,基于nodejs开发的进程管理器,适用于后台常驻脚本管理,同时对node网络应用有自建负载均衡功能。官方的说法,pm2 是一个带有负载均衡功能的Node应用的进程管理器,个人认为,并不准确,因为pm2支持多种语言,只是对于除node之外的其他进程无负载均衡的能力。

一 pm2特点:

说一些pm2有哪些优点好处呢?

01. 支持进程行为配置 ,即可以通过配置,实现对pm2管理应用的一些基础属性更新修改,如应用名称,启动模式等;

02. 支持集群模式,支持负载均衡,但因采用nodejs的cluster模块实现,仅适用于nodejs进程;

03. 支持source map,此项针对js, source map文件是js源文件的信息文件,里面存储着源文件的位置信息;

04. 支持热重启;

05. 支持部署工作流,pm2可依据测试环境和线上环境自动部署到不同的服务器,同时运行在不同配置下;

06. 支持监听重启,在文件更新等情况下可实现进程自动重启;

07. 支持linux的startup进程启动,startup是指系统boot, 进程自启动,如centos的chkconfig;

08. 日志管理,两种日志,pm2系统日志与管理的进程日志,默认会把进程的控制台输出记录到日志中;

09. 命令自动补全功能,个人感觉这个功能意义不大,而且尝试了一下,没有原生的linux命令自动补全反应敏捷;

10. 监控功能,pm2 monit监控cpu和memory使用情况,keymetrics监控更为详细;

11. 支持开发调试模式,非后台运行,pm2-dev start ;

12. 支持pm2模块开发,实现pm2的功能扩展;

13. keymetrics监控,比pm2 monit监控更为详细友好,通过web页面展示;

14. 最大内存重启,设置最大内存限制,超过限制自动重启;

15. 编程API,提供API供开发者通过编程方式灵活管理进程;

以上简要概述了pm2进程管理工具的特点。

二 pm2常用命令

常用命令通常都是比较简单。下面列举一些pm2常用的管理命令

pm2 start [options] 启动指定应用,如pm2 start index.js --name httpServer;

pm2 stop [options] 停止指定应用,如pm2 stop httpServer;

pm2 reload|restart [options]  重启指定应用,如pm2 restart httpServer;

pm2 show [options] 显示指定应用详情,如pm2 show httpServer;

pm2 delete [options] 删除指定应用,如pm2 delete httpServer,如果修改应用配置行为,最好先删除应用后,重新启动方才生效,如修改脚本入口文件;

pm2 kill 杀掉pm2管理的所有进程;

pm2 logs  查看指定应用的日志,即标准输出和标准错误;

pm2 monit 监控各个应用进程cpu和memory使用情况;

三 pm2常用配置

pm2 配置方式

命令行方式

pm2 start index.js --name HttpServer --interpreter node

此处通过命令的选项配置应用名称为httpServer,index.js脚本文件解释器为node,更多选项可查看pm2 --help获取;

配置文件方式

pm2配置文件方式支持yml与json格式

processes.yml文件


processes.json

配置项

name  应用进程名称;

script  启动脚本路径;

cwd  应用启动的路径,关于script与cwd的区别举例说明:在/home/polo/目录下运行/data/release/node/index.js,此处script为/data/release/node/index.js,cwd为/home/polo/;

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  异常重启情况下,延时重启时间;

上面内容比较枯燥无味,下面是结合自己实践中遇到的一些坑做的思考总结。

四 fork与cluster启动模式

pm2启动进程的支持两种模式:fork与cluster,对于了解node的人知道,node的多进程编程api: child_process.fork与cluster。关于pm2的fork与cluster两者的本质区别,个人认为就是node API的child_process.fork与cluster的区别,stackoverflow有关于这个问题的讨论  http://stackoverflow.com/questions/34682035/cluster-and-fork-mode-difference-in-pm2。下面做个粗浅的归纳:

cluster是fork的派生,cluster支持所有cluster拥有的特性;

fork不支持socket地址端口复用,cluster支持地址端口复用。因为只有node的cluster模块支持socket选项SO_REUSEADDR;

fork不可以启动多个实例进程,cluster可以启动多个实例。但node的child_process.fork是可以实现启动多个进程的,但是为什么没有实现呢?就个人理解,node多为提供网络服务,启动多个实例需要地址端口复用,此时便可使用cluster模式实现,但fork模式并不支持地址端口复用,多实例进程启动会产生异常错误。但对于常驻任务脚本而言,不需要提供网络服务,此时多进程启动可以实现,同时也提高了任务处理效率。对于上述需求,可以两种方式实现,一是配置app0,app1,app2方式启动多个进程,二是通过应用实例自身调用child_process.fork多进程编程实现;

fork模式可以应用于其他语言,如php,python,perl,ruby,bash,coffee, 而cluster只能应用于node;

fork不支持定时重启,cluster支持定时重启。定时重启也就是配置中的cron_restart配置项。github上面有作者关于fork模式下是否需要实现cron-like定时的讨论:

https://github.com/Unitech/pm2/issues/496

官网文档注明说,fork模式的定时重启这个功能不久将实现,期待中吧... ...

五 pm2的监控

pm2的监控有两种方式:

cli方式监控

pm2 monit是专门用来监控的命令,监控项包括cpu与内存

缺点monit展示内容太过粗糙,不够详细

pm2 list展示当前所有pm2的管理项目

可以查看出每个进程的运行状态。

如果需要更详细的监控内容,对于cli而言一般都是可以实现的。

这种监控方式的缺点:

a. 不够直观,需要自己去执行命令并分析结果;

b. 不便于多台服务器的应用监控管理;

由于这些缺点,就需要一种更好的方式去监控我们的应用

keymetrics监控

keymetrics监控是PM2的开发者的开发和维护的一款监控工具,可以尝试一下,安装配置非常容易,我也只是粗浅的尝试了一下,可以参考

http://cnodejs.org/topic/56554300ad12df5d4e050b56

本人对监控研究不多,这里的监控主体是应用进程,非服务器,就只说说我比较喜欢的几个功能:

a. 利于多服务器监控管理;

b. 代码异常,可以看出程序长期运行中的稳定性;

c. 支持应用基本的启动,重启与停止等功能;

但是,keymetrics是一款商业版的监控软件,免费版功能有限,且只有两台服务器的免费配额,这款软件的服务端非自建,采用的是将应用监控数据定时上抛第三平台,对于有着众多服务器的公司而言费用昂贵,而且服务器与应用服务进程等状态信息是敏感性数据,接入到第三方平台中无法接受。当然,如果是服务器数量有限,能够支付昂贵的使用费用,无敏感数据等场景的话,推荐使用Keymetrics,毕竟是PM2的开发者的开发和维护,功能特性很丰富。

鉴于以上问题,国内牛人开发了一款类似的免费工具,本人没有研究过,名字很有趣: pm2.5。链接地址

http://www.open-open.com/lib/view/open1451825410105.html

关于监控,本人经验不多,就不多妄言了

六 日志问题

日志系统对于任意应用而言,通常都是必不可少的一个辅助功能。pm2的相关文件默认存放于$HOME/.pm2/目录下,其日志主要有两类:

a. pm2自身的日志,存放于$HOME/.pm2/pm2.log;

b. pm2所管理的应用的日志,存放于$HOME/.pm2/logs/目录下,标准谁出日志存放于${APP_NAME}_out.log,标准错误日志存放于${APP_NAME}_error.log;

这里之所以把日志单独说明一下是因为,如果程序开发不严谨,为了调试程序,导致应用产生大量标准输出,使服务器本身记录大量的日志,导致服务磁盘满载问题。一般而言,pm2管理的应用本身都有自己日志系统,所以对于这种不必要的输出内容需禁用日志,重定向到/dev/null。

与crontab比较,也有类似情况,crontab自身日志,与其管理的应用本身的输出。应用脚本输出一定需要重定向到/dev/null,因为该输出内容会以邮件的形式发送给用户,内容存储在邮件文件,会产生意向不到的结果,或会导致脚本压根不被执行;

七 稳定运行建议

PM2是一款非常优秀的Node进程管理工具,它有着丰富的特性:能够充分利用多核CPU且能够负载均衡、能够帮助应用在崩溃后、指定时间(cluster model)和超出最大内存限制等情况下实现自动重启。

个人几点看法保证常驻应用进程稳定运行:

1. 定时重启,应用进程运行时间久了或许总会产生一些意料之外的问题,定时可以规避一些不可测的情况;

2. 最大内存限制,根据观察设定合理内存限制,保证应用异常运行;

3. 合理min_uptime,min_uptime是应用正常启动的最小持续运行时长,超出此时间则被判定为异常启动;

4. 设定异常重启延时restart_delay,对于异常情况导致应用停止,设定异常重启延迟可防止应用在不可测情况下不断重启的导致重启次数过多等问题;

5. 设置异常重启次数,如果应用不断异常重启,并超过一定的限制次数,说明此时的环境长时间处于不可控状态,服务器异常。此时便可停止尝试,发出错误警告通知等。

关于pm2的使用,主要还是运用于常驻脚本。定时任务,更多还是需要专门的定时任务管理工具crontab,不过crontab在使用中总会有各种不爽的问题,提供一个链接,关于crontab的问题,以及提出了一个新工具jobCenter,本人暂未仔细研究,粗略看了一下好像还不错:

http://mp.weixin.qq.com/s?__biz=MzA3MzYwNjQ3NA%3D%3D&from=timeline&hmsr=toutiao.io&idx=1&isappinstalled=0&mid=208434536&scene=2&sn=be02773ef6bb90ad56a7b4333dd119f5&srcid=0929FOcv2W14C8OaztPznanb&utm_medium=toutiao.io&utm_source=toutiao.io

对于工具使用,于人而言,什么工具不是最重要的,而是在于人。这个道理很多人都是清楚明白。对于互联网it行业,如今各种开源软件繁多,每种使用场景下的工具通常都不止一种。对于公司而言,一个新的工具上线,一定是需要一位十分精通的人去引进并进行答疑解惑,以避免再好的工具也被滥用的情况发生。

最后说明,文章中有些个人思考,望不影响他人判断,如有错误,请指正,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容