一、前言
一般在自己机器上搭建环境,可能会有很多个脚本需要在后台启动,比如MQ,Zk,Redis,Kafka等,但是,每次都频繁找bin目录之类的都会很麻烦,Supervisor提供了很好的进程管理,本篇将简单介绍其基本使用。
二、简介
Supervisor ( http://supervisord.org ) 是一个用Python 写的进程管理工具,可以很方便的用来启动、重启、关闭进程(不仅仅是 Python 进程)。除了对单个进程的控制,还可以同时启动、关闭多个进程,比如很不幸的服务器出问题导致所有应用程序都被杀死,此时可以用 supervisor 同时启动所有应用程序而不是一个一个地敲命令启动。
三、安装(基于Mac OSX)
1) brew install python
2) pip install supervisor
注意:mac osx上自带python,可以先卸载或者将其覆盖
四、创建配置文件
1) 使用echo_supervisord_conf命令,到指定的目录,个人不喜欢都放在根目录下,如下:
echo_supervisord_conf > /Users/liaomengge/shell/supervisor/supervisord.conf
2) vi supervisord.conf
; Sample supervisor config file.
[unix_http_server]
file=/Users/liaomengge/shell/supervisor/supervisor.sock ; (the path to the socket file)
[inet_http_server] ; inet (TCP) server disabled by default
port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)
username=liaomengge ; (default is no username (open server))
password=liaomengge ; (default is no password (open server))
[supervisord]
logfile=/Users/liaomengge/shell/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups;default 10)
loglevel=error ; (log level;default info; others: debug,warn,trace)
pidfile=/Users/liaomengge/shell/supervisor/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)
directory=/Users/liaomengge/shell/supervisor ; (default is not to cd during start)
childlogdir=/Users/liaomengge/shell/supervisor ; ('AUTO' child log dir, default $TEMP)
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///Users/liaomengge/shell/supervisor/supervisor.sock
[include]
files = /Users/liaomengge/shell/supervisor/conf/*.conf
注意:默认的配置文件supervisord.pid 以及 supervisor.sock 是放在 /tmp 目录下,但是 /tmp 目录是存放临时文件,里面的文件是会被 Linux 系统删除的,一旦这些文件丢失,就无法再通过 supervisorctl 来执行 restart 和 stop 命令了,将只会得到 unix:///tmp/supervisor.sock 不存在的错误,得注意咯~~~
3) 编写应用程序
单进程的配置:
[program:zk]
command=/Users/liaomengge/local-env/zookeeper/zookeeper-3.3.6-1/bin/zkServer.sh start
autostart=false
autorestart=false
stdout_logfile=/Users/liaomengge/shell/supervisor/log/zk.stdout.log
stderr_logfile=/Users/liaomengge/shell/supervisor/log/zk.stderr.log
stdout_logfile_maxbytes =500MB
stdout_logfile_backups =50
stdout_capture_maxbytes =1MB
stdout_events_enabled =false
多进程的配置:
只需要在单进程的前提下,多增加一个配置文件,如下:
[group:zkCluster]
programs=zk1,zk2
使用start groupName:name或者*(代表全部组员),即可对多进程管理。
说明:配置程序需要交由supervisor管理的文件,指定的目录为上面`[include]`中配置的文件路劲,启动时,会加载conf下所有*.conf文件
五、 初始启动
supervisord -c /etc/supervisord.conf,如下使用的是自定义目录(推荐)
supervisord -c /Users/liaomengge/shell/supervisor/supervisord.conf
建议,在~./bash_profile中配置alias,如下:
alias supervisord='supervisord -c /Users/liaomengge/shell/supervisor/supervisord.conf'
可能会出现如下界面:
解决方案:unlink supervisord.conf 关于其详情可见:https://github.com/Supervisor/supervisor/issues/121
六、 管理界面执行supervisorctl命令,将会看到如下界面:
之后,可以通过start,stop,restart,reload,update等指令来管理配置的所有子进程。
七、 web 界面
supervisor中还提供了,相应的界面管理,见上面的[inet_http_server]配置,如下:
可以通过图形化界面,查看,停用当前的进程~
八、常见问题解决
1) 通过supervisord可以很方便的管理program,可以同时管理多个program,也可以管理一个program的多个进程。而且提供了命令行、web、xml-rpc的接口来管理和监控进程,通过配置文件,可以指定进程挂掉后如何处理(可以重启或者其它方式处理挂掉的进程),但是,supervisord本身也是一个program,如果它自己挂掉了怎么办???
详情见:http://serverfault.com/questions/96499/how-to-automatically-start-supervisord-on-linux-ubuntu
总结,通过上面的简单配置,就可以轻松的管你的进程了,再也不需要到处去找启动文件了 。。。
参考文档:
https://www.restran.net/2015/10/04/supervisord-tutorial/