实际项目中,经常遇到需要管理进程的运行状态,在进程挂掉以后,系统能够自动重启进程,从而防止进程挂掉导致的服务不可用。Supervisor是一个运行与Liunx的进程监控工具,可以管理和监控Liunx上面的进程,并在进程异常退出后,重启进程,每一个Supervisor管理的进程都是其子进程,因此可以监控到进程的状态。
官网:Supervisor
Supervisor主要组件
- supervisord
主进程,负责管理进程的server,其根据配置文件创建子进程,并对进程进行监控,负责对crash的进程进行重启,向子进程发出事件通知等。 - supervisorctl
supervisor的命令行工具 - Web Server
superviosr提供了web server功能,可通过web控制进程(需要设置[inethttpserver]配置项) - XML-RPC Interface
XML-RPC接口, 就像HTTP提供WEB UI一样,用来控制supervisor和由它运行的程序。
安装及使用
supervisor目前只支持python2
- 安装:
pip install pip install supervisor
- 生成配置文件:
echo_supervisord_conf > /etc/supervisord.conf
- 更改配置文件:
vim /etc/supervisord.conf
- 启动:
supervisorctl -c /etc/supervisord.conf
supervisorctl命令
supervisorctl help
和supervisorctl -h
查看,此处仅列出主要功能
-
supervisorctl -c/--configuration FILENAME
:指定配置文件启动supervisor -
supervisorctl start [program name]/all
:启动某个/全部进程 -
supervisorctl restart [program name]/all
:重启某个/全部进程 -
supervisorctl reload
:重启supervisor及其子进程 -
supervisor update
:更新配置,但不重启进程 -
supervisor stop [program name]/all
:停止某个/全部进程
配置文件
;[program:theprogramname]
;command=/bin/cat ; 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) #随supervisor启动而启动
;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) #进程挂掉后是否重新启动,false:进程不会自动重启,unexpected:当程序退出时的退出码不是exitcodes中定义的时,进程会重启,true:进程会无条件重启当退出的时候
;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=/a/path ; 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=/a/path ; 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)
示例:
[program:test]
command=/home/ubuntu/transfer/bin/python /home/ubuntu/transfer/test.py
directory=/home/ubuntu/transfer
autostart=true
autorestart=true
stdout_logfile=/home/ubuntu/transfer/test.log
stderr_logfile=/home/ubuntu/transfer/test.log
集群管理
supervisor本身不支持多机管理,但是可以通过其提供的
xml-rpc
进行二次开发用来支持多机管理
开源组件:cesi
网友评论