supervisor是Linux下一个便利的启动和监控服务的命令。
举例来说:假如我想同时管理一堆的服务,包括他们的运行和停止。我就可以使用supervisor来管理。
supervisor包括两个命令:supervisord和supervisorctl,分别是后台的守护进程以及命令行管理命令。要安装这两个命令只需要执行sudo apt-get install supervisor即可。
两个命令共用一个配置文件,默认是:/etc/supervisor/supervisor.conf,而supervisor.conf 通过[include] 这个section来引入其它配置文件,一般放在/etc/supervisor/conf.d目录,所以我们可以将需要的文件放到这个目录之下,并将后缀改为.conf。
除了默认的配置之外,一个常用的配置方式是在使用启动的时候指定特定的配置文件,配置方式为: sudo supervisord -c /path/to/supervisor.conf ,注意,这时候的配置文件要使用绝对路径,并且配置文件要完整,否则可能会报错。
supervisord只会启动一个supervisord守护进程,剩下的管理工作都交给supervisorctl命令来完成。同样的,如果指定了某一个配置文件来启动服务,那么supervisorctl的命令也要加上相对应的路径来管理:sudo supervisorctl -c /path/to/supervisor.conf,这个命令敲下之后就会进入命令行模式,对应用进行管理。
典型的supervisor.conf配置如下:(配置文件的注释用分号开头)
; supervisor config file [unix_http_server] ; supervisor与supervisorctl的通讯 file=/var/run/supervisor.sock ; (the path to the socket file) should match serverurl in section supervisorctl chmod=0700 ; sockef file mode (default 0700) [supervisord] ; 必须有,用来配置supervisord logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP) ; the below section must remain in the config file for RPC ; (supervisorctl/web interface) to work, additional interfaces may be ; added by defining them in separate rpcinterface: sections [rpcinterface:supervisor] ; 这个配置项必须有 supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] ; 必须有,用于配置supervisorctl serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket ; The [include] section can just contain the "files" setting. This ; setting can list multiple files (separated by whitespace or ; newlines). It can also contain wildcards. The filenames are ; interpreted as relative to this file. Included files *cannot* ; include files themselves. [include] ;引入其它配置文件 files = /path/to/*.conf # other configuration files you want to include [program:api4c] ;应用程序的配置 command=/path/to/python/env/bin/gunicorn -w 1 -b 0.0.0.0:8888 wsgi:application ; 执行你的命令,不能是用于启动守护进程,因为supervisor就是用来作为守护进程的 directory=/home/ubuntu/4c-entry/api4c ; chdir to here before command run startsecs=0 ; stopwaitsecs=0 ; autostart=true ; supervisord启动的时候自动运行 autorestart=true ; 当程序中断的时候是否重启 stop,true,false,unexpected stdout_logfile=/path/to/logfile.log ; 必须已经存在
stderr_logfile=/path/to/std/err/log/for4c.err
上面是一个基本的服务,用于管理一个服务进程,包含几个必要的section:supervisord、supervisorctl、program:your_program_name、rpcinterface:supervisor、include。
这几个是一定要配置的,缺少supervisord和supervisorctl和rpcinterface:supervisor会报错,include是可选的,如果你没有引入其他的配置文件的话。
关于supervisord和supervisorctl的通讯方式有两种:一种是通过sock来传输,也就是unix_http_server的配置,另一种是inet_http_server,通过http进行通讯,详细的设置可以参考supervisor的配置文档。
supervisor的常用命令:
supervisord -c supervisor.conf 通过配置文件启动supervisor
supervisorctl -c supervisor.conf status 察看supervisor的状态
supervisorctl -c supervisor.conf reload 重新载入 配置文件 更新后可以选择重新载入
supervisorctl -c supervisor.conf start [all] | [appname] 启动指定/所有 supervisor管理的程序进程
supervisorctl -c supervisor.conf stop [all] | [appname]
supervisorctl -c supervisor.conf status 察看supervisor的状态
supervisorctl -c supervisor.conf reload 重新载入 配置文件 更新后可以选择重新载入
supervisorctl -c supervisor.conf start [all] | [appname] 启动指定/所有 supervisor管理的程序进程
supervisorctl -c supervisor.conf stop [all] | [appname]
命令使用实例:
来源: http://chenxiaoyu.org/2011/05/31/python-supervisor.html
配置项:
[program:hello] command=python /home/smallfish/hello.py autorstart=true stdout_logfile=/home/smallfish/hello.log 命令
shell> sudo /etc/init.d/supervisor start -- 启动supervisor服务 shell> sudo supervisorctl status hello -- 获取hello服务的状态,因为是autorstart,这里已经启动了 hello RUNNING pid 1159, uptime 0:20:32 shell> sudo supervisorctl stop hello -- 停止hello服务 hello: stopped shell> sudo supervisorctl stop hello -- 再次停止hello,会有错误信息 hello: ERROR (not running) shell> sudo supervisorctl start hello -- 启动hello服务 hello: started