七、Supervisor进程管理利器

概要

周五发现在各个线上的环境中,有个目录中存了大量的日志信息,非常的占用磁盘空间,经过查看发现是由于之前在建立由Supervison管理的任务时,各个进程的日志管理配置不统一导致。有的日志200M有的500M,有的日志数量5个也有30个的。为了便于管理并且节省磁盘空间,准备将所有的日志设置为每200M分隔一次,共5次。
在完成该工作的过程中需要了解以下几点:
1、supervisor的使用
2、sed替换匹配模式之后的一整行
3、awk和xargs的联合使用

Supervisor简单介绍

Linux的后台进程运行有好几种方法,例如nohup,screen等,但是,如果是一个服务程序,要可靠地在后台运行,我们就需要把它做成daemon,最好还能监控进程状态,在意外结束时能自动重启。Supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。
在使用Supervisor时,可以随时使用Supervisor的客户端Supervisorctl来管理进程,查看状态,重启,停止等。

supervisor在EPEL源中,使用yum安装需要先安装EPEL源
[root@localhost ~]# yum install supervisor
[root@localhost ~]# rpm -ql supervisor
/etc/logrotate.d/supervisor
/etc/rc.d/init.d/supervisord
/etc/supervisord.conf     
/usr/bin/supervisorctl
/usr/bin/supervisord

修改配置文件并且创建被其管理的进程,可以直接在主配置文件中定义各个进程,但是在生产环境中我们经常要有许多进程需要被管理,那么通常会在一个子配置文件夹中,为各个进程分别创建各自的配置文件,那么我们需要在主配置文件中定义子配置文件夹目录:

[root@localhost ~]# vi /etc/supervisord.conf    
[include]
files = /etc/supervisor/*.ini
新增以上两行,文件可以使用ini结尾或者是conf结尾的文件
[root@localhost ~]#  vi /etc/supervisor/program1.ini
[program:program1]                                   #定义该进程的在supervisor中的名称
command=/www/site/program/program_name arg1 arg2     #定义该进程启动的脚本命令
autostart = true                                     #在supervisord 启动的时候也自动启动
startsecs = 5                                        #启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true                                   #程序异常退出后自动重启
startretries = 3                                     #启动失败自动重试次数,默认是 3
redirect_stderr = true                               #把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 200MB                      #stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 5                           #stdout 日志文件备份数
stdout_logfile = /www/site/logs/program1.log    #stdout 日志文件
定义完进程之后,启动supervisor,若autostart = true,启动supervisor时该进程也会自动启动,启动后就可以使用supervisorctl进程管理各个进程。
[root@localhost ~]# service supervisord start
[root@localhost ~]# supervisorctl status
program1                      RUNNING   pid 24128, uptime 0:01:56

在日常工作中,需要用到的最多的就是需要新增一个supervisor管理的进程时,我们在增加完进程的配置文件之后,不需要重启supervisor,使用supervisorctl即可完成上线工作。

[root@localhost ~]# supervisorctl update new_program_name
[root@localhost ~]# supervisorctl start new_program_name

当然也会遇到批量重启任务的时候,比如说某个研发GG改了最底层的某个进程内容,那么需要重启所有的进程才会恢复正常,可以使用all来完成

[root@localhost ~]# supervisorctl restart all   
[root@localhost ~]# supervisorctl
supervisor> restart
Error: restart requires a process name
restart <processname>           Restart a process.                          #重启单个进程
restart <processname> <processname> Restart multiple processes              #重启多个进程
restart all             Restart all processes                               #重启所有进程

像我们这次需要完成的任务是将所有进程存留的日志格式规范化,需要更新所有进程的配置文件,那边我们需要先对所有进程进程update,然后在start一次,指的注意的是,我们在update已经started的任务时,supervisor会先停止该进程,然后进行更新,更新完之后并不会自动启动进程。所以我们就需要了解到进程什么时候可以update,执行update停止进程时不会影响到线上业务时才可以执行,要不然就要上演一场从更新进程到跑路的大戏了。。。

[root@localhost ~]# supervisorctl update all
[root@localhost ~]# supervisorctl start all

使用sed规范所有进程配置文件的日志配置

1、所有日志均存在 /etc/supervisor/*.ini中
2、定义日志大小的参数stdout_logfile_maxbytes
3、定义日志数量的参数stdout_logfile_backups
综合以上三点来看虽然有几十个进程配置文件,所幸还是有规律可选,所以完成起来也算简单,这时候就体现了sed的强大之处,基础知识不扎实这个时候就要求助于google了。

[root@localhost ~]# sed -i "s/^.*stdout_logfile_maxbytes.*$/stdout_logfile_maxbytes = 200MB/g" /etc/supervisor/*.ini     
[root@localhost ~]# sed -i "s/^.*stdout_logfile_backups.*$/stdout_logfile_backups = 5/g" */etc/supervisor/.ini 
[root@localhost ~]# supervisorctl update all
[root@localhost ~]# supervisorctl start all
#两次整行替换,然后更新配置文件后启动所有进程,大功告成~!

更新完进程之后,还有一个问题就是处理目前已经产生的日志了,在之前有很多的日志备份最多的存在30份,虽然更新了进程将所有的日志设置为5份,但是在不确定supervisor会不会回滚之前已经产生的多余日志的情况下还是手动删除为好,秉持着能用一条命令的情况下绝不使用两条命令,执行以下删除命令即可:

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

推荐阅读更多精彩内容