Mapz's Blog

可以递归的函数指针

使用supervisor来监控系统进程

原文地址 Mapz的Blog

前言

跑着的进程被系统杀啦?OOM?CPU爆了?一个稳定的系统环境需要一个进程监控工具,supervisor是一款基于Pyhton的进程监控工具,这次我们来学习使用之。

官方文档点我

安装

用pip安装的话,python3上现在还没有可用的安装包(貌似)

所以我们用虚拟环境搭载python2.7安装supervisor

假设我们已经安装好了Python的虚拟环境工具 virturlenv

在你合适的目录下

1
2
3
virtualenv --python=python2.7 ./supervisor_env
source supervisor_env/bin/activat
pip install supervisor

安装完成!

使用

1
echo_supervisord_conf

这个可以显示supervisor的默认配置项目

我们把这些配置导入一个文件

1
echo_supervisord_conf > ./supervisord.conf

然后使用 supervisord -c 配置文件路径 就可以启动了
如果不用-c参数则会按下列顺序来查找配置

$CWD/supervisord.conf, $CWD/etc/supervisord.conf, /etc/supervisord.conf

所以我们的启动命令为

1
supervisord -c ./supervisord.conf

配置

配置include文件内容

我们可以把所有的配置项目都写入到 supervisord.conf 里面,但是这样显然不方便管理,我们最好把监控不同程序的配置分别写成配置文件,然后在supervisord.conf中来引用他们

新建一个目录来存储我们的各目录配置

1
mkdir process_config

编辑supervisord.conf,最下方include注释解开,改为

1
2
[include]
files = process_config/*.conf

配置程序监控

以我机器上经常因为OOM而挂掉的elasticsearch为例,我们来写一份配置

我们的安装路径位于

~/Downloads/elasticsearch-5.2.2/bin

所以这个进程启动命令应该是

1
~/Downloads/elasticsearch-5.2.2/bin/elasticsearch

我们在 process_config 目录下创建新配置文件 elasticsearch.conf

1
2
cd process_config
touch elasticsearch.conf

编辑之

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[program:elasticsearch]
directory = ~/Downloads/elasticsearch-5.2.2/bin/ ; 程序的启动目录
command = elasticsearch ; 启动命令,可以看出与手动在命令行启动的命令是一样的
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = MapzChen ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = ./logs/usercenter_stdout.log ;目录要存在哦

; 可以通过 environment 来添加需要的环境变量,一种常见的用法是修改 PYTHONPATH
; environment=PYTHONPATH=$PYTHONPATH:/path/to/somewhere

管理

supervisor 自带了Shell管理工具 supervisorctl

运行方式和运行supervisor一致

1
supervisorctl -c ./supervisord.conf

运行后进入shell

1
2
3
4
5
6
> status    # 查看程序状态
> stop usercenter # 关闭 usercenter 程序
> start usercenter # 启动 usercenter 程序
> restart usercenter # 重启 usercenter 程序
> reread # 读取有更新(增加)的配置文件,不会启动新添加的程序
> update # 重启配置文件修改过的程序

实战

运行 supervisor 后老出错找不到elasticsearch,然后路径什么的配置的并没有问题呀

网上找了个办法,使用一个bash文件来打开elas,然后supervisor中配置这个bash文件

创建程序的启动脚本

创建一个脚本来启动elas,并加入权限

1
2
3
mkdir bashs
touch bashs/elasticsearch.sh
chmod bashs/elasticsearch.sh

编辑 bashs/elasticsearch.sh

1
2
#!/bin/bash  
/Users/mapzchen/Downloads/elasticsearch-5.2.2/bin/elasticsearch

重新配置 elasticsearch.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[program:elasticsearch]
directory = /Volumes/store/py_apps/supervisor/bashs ; 程序的启动目录
command = /Volumes/store/py_apps/supervisor/bashs/elasticsearch.sh ; 启动命令,可以看出与手动在命令行启动的命令是一样的
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = mapzchen ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = ./logs/usercenter_stdout.log ;目录要存在哦

; 可以通过 environment 来添加需要的环境变量,一种常见的用法是修改 PYTHONPATH
; environment=PYTHONPATH=$PYTHONPATH:/path/to/somewhere

启动,检查状态

1
elasticsearch                    RUNNING   pid 35058, uptime 0:06:11

已经启动成功啦~~