UU Blog

用supervisor来监控进程

Supervisor简述

关于Java进程监控,一直都是要搞的。至于怎么实现,一直比较纠结,也就拖了很久。

最近看到supervisor,感觉还不错,打算试试。

简单简单一句话描述supervisor的作用的话。

可以把一个命令变成daemon进程管理,可以实现异常重启

另外还提供了API,这为提供WEB式管理提供了便利,官方有带了一个简陋的web界面,也有一些第三方的似乎看起来也不错。

通过supervisor运行的,都成为supervisor的子进程,它也是通过这个去管理进程,比通过pid文件管理更稳定。因为有时候进程异常退出,pid存放的数据就是错的,有可能导致其它进程被意外终结。

支持的平台

Supervisor works on just about everything except for Windows.

准确点说,基本UNIX-Like系统都支持。

主要组件

supervisord

supervisor的服务进程,响应客户端的命令、管理子进程

使用的时候要读取配置文件。寻找配置文件的优先级如下:

1
2
3
4
5
6
$CWD/supervisord.conf
$CWD/etc/supervisord.conf
/etc/supervisord.conf
/etc/supervisor/supervisord.conf (since Supervisor 3.3.0)
../etc/supervisord.conf (Relative to the executable)
../supervisord.conf (Relative to the executable)

不过建议还是启动的时候,制定配置文件所在的绝对路径。

supervisorctl

supervisor的命令行客户端

配置项在 [supervisorctl]

Web Server

supervisor的web服务,web提供少量功能管理supervisor。

配置[inet_http_server]

XML-RPC

API接口

介绍:XML-RPC API Documentation

安装

  • sudo pip install supervisor

or

  • esay_install supervisor

安装完运行echo_supervisord_conf,如果能输出配置,那就安装完成了。

使用说明

配置

其实在echo_supervisord_conf后,前面几行就有官方的配置说明文档链接:http://supervisord.org/configuration.html

不过未免巨细无遗了。

根据需求,我们需要监控进程,需要可以在线管控进程状态,简单配置几项就行了。配置文件语法是Windows-INI Style。

创建配置

启动supervisord组件的时候,它会从前面提到的搜寻文件路径,按优先级去找配置文件。为了避免加载到非我们修改的配置,建议启动的时候-c指定一些配置文件。

这里为了方便管理配置文件,我把它放到/etc/supervisor/supervisor.conf program的配置文件放到 `./conf.d/.conf` *

1
2
# mkdir -p /etc/supervisor/conf.d/
# echo_supervisord_conf > /etc/supervisor/supervisor.conf

修改配置

  • vim /etc/supervisor/supervisor.conf

主要改动如下内容:

1
2
3
4
[inet_http_server]         ; inet (TCP) server disabled by default
port=127.0.0.1:9001 ; ip_address:port specifier, *:port for all iface
username=onecer ; default is no username (open server)
password=youpassword ; default is no password (open server)

这里port,如果你想可以通过外网IP+端口访问web dashboard,那就改为*:9001或者0.0.0.0:9001

这里我打算到时候用nginx做反向代理,绑定域名,所以就无所谓,127.0.0.1 。

username和password就是管理账户。

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

这里原本是ini后缀的,但是我想入乡随俗,在linux就改为conf后缀的配置文件吧。用的相对路径,如果我们加载的是/etc/supervisor/supervisor.conf 那这个就表加载/etc/supervisor/conf.d/目录下所有的conf文件。

事实这个可以省了,program配置直接写在主配置文件里面。不过,如果程序多的话,还是建议分开。像nginx一样,这样利于以后维护各个配置。

主配置里面有很多program的配置示例,可以复制一个过去修改即可使用。

  • 新建一个配置vim /etc/supervisor/conf.d/java_room_status.conf

复制主配置里面一段program的配置出来贴上,稍作修改即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[program:roomstatus_dev]
command=/usr/bin/java -jar /data/www/room/devshixin.jar ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs=1 ; number of processes copies to start (def 1)
;directory=/tmp ; directory to cwd to before exec (def no cwd)
;umask=022 ; umask for process (default None)
;priority=999 ; the relative start priority (default 999)
autostart=true ; start at supervisord start (default: true)
;startsecs=1 ; # of secs prog must stay up to be running (def. 1)
;startretries=3 ; max # of serial start failures when starting (default 3)
autorestart=unexpected ; when to restart if exited after running (def: unexpected)
;exitcodes=0,2 ; 'expected' exit codes used with autorestart (default 0,2)
;stopsignal=QUIT ; signal used to kill process (default TERM)
;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
;stopasgroup=false ; send stop signal to the UNIX process group (default false)
;killasgroup=false ; SIGKILL the UNIX process group (def false)
;user=chrism ; setuid to this UNIX account to run the program
;redirect_stderr=true ; redirect proc stderr to stdout (default false)
stdout_logfile=/var/log/dev_room.log ; stdout log path, NONE for none; default AUTO
stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=10 ; # of stdout logfile backups (0 means none, default 10)
;stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
;stdout_events_enabled=false ; emit events on stdout writes (default false)
stderr_logfile=/var/log/err_dev_room.log ; stderr log path, NONE for none; default AUTO
stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
stderr_logfile_backups=10 ; # of stderr logfile backups (0 means none, default 10)
;stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
;stderr_events_enabled=false ; emit events on stderr writes (default false)
;environment=A="1",B="2" ; process environment additions (def no adds)
;serverurl=AUTO ; override serverurl computation (childutils)

参考资料

给作者打一针鸡血