Supervisor
supervisor简介
supervisor是一个管理进程的工具,python语言开发的通用的管理程序,可以管理和监控Linux上的进程,能将进程变成后台的daemon,并监控进程状态,出现异常退出时能自动重启。
保持程序在后台的服务器上保持运行状态,是实际生产环境中常需要的需求,避免后台进程崩溃,频繁手动重启程序十分费事,疏忽大意也会使程序得不到监控,supervisor是一个很好的选择。
supervisor组件
- supervisord
supervisor的服务器端部分,启动supervisor就是运行这个命令 - supervisorctl
启动supervisor的命令行窗口 - Web Server
提供web接口进行访问控制 - XML-RPC interface
supervisor安装
Linux下安装命令
pip install supervisor
生成supervisor配置文件
echo_supervisord_conf > supervisor.conf
系统会生成/etc/supervisord.conf
默认文件,在这个配置文件里有有英文注释,很人性化。每个组件部分都有自己的参数设置。在supervisor /etc/supervisord.conf
配置文件中 使用 include在配置文件的最后,有一个 [include] 的配置项,跟 Nginx 一样,可以 include 某个文件夹下的所有配置文件,
这样我们就可以为每个进程或相关的几个进程的配置单独写成一个文件。
对于要监控的程序配置文件,样板如下
270 ;[program:theprogramname]
271 ;command=/bin/cat ; the program (relative uses PATH, can take args)
272 ;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
273 ;numprocs=1 ; number of processes copies to start (def 1)
274 ;directory=/tmp ; directory to cwd to before exec (def no cwd)
275 ;umask=022 ; umask for process (default None)
276 ;priority=999 ; the relative start priority (default 999)
277 ;autostart=true ; start at supervisord start (default: true)
278 ;startsecs=1 ; # of secs prog must stay up to be running (def. 1)
279 ;startretries=3 ; max # of serial start failures when starting (default 3)
280 ;autorestart=unexpected ; when to restart if exited after running (def: unexpected)
281 ;exitcodes=0,2 ; 'expected' exit codes used with autorestart (default 0,2)
282 ;stopsignal=QUIT ; signal used to kill process (default TERM)
283 ;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
284 ;stopasgroup=false ; send stop signal to the UNIX process group (default false)
285 ;killasgroup=false ; SIGKILL the UNIX process group (def false)
286 ;user=chrism ; setuid to this UNIX account to run the program
287 ;redirect_stderr=true ; redirect proc stderr to stdout (default false)
288 ;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO
289 ;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
290 ;stdout_logfile_backups=10 ; # of stdout logfile backups (0 means none, default 10)
291 ;stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
292 ;stdout_events_enabled=false ; emit events on stdout writes (default false)
293 ;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO
294 ;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
295 ;stderr_logfile_backups=10 ; # of stderr logfile backups (0 means none, default 10)
296 ;stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
297 ;stderr_events_enabled=false ; emit events on stderr writes (default false)
298 ;environment=A="1",B="2" ; process environment additions (def no adds)
299 ;serverurl=AUTO ; override serverurl computation (childutils)
300
301 ; The sample eventlistener section below shows all possible eventlistener
302 ; subsection values. Create one or more 'real' eventlistener: sections to be
303 ; able to handle event notifications sent by supervisord.
(其中分号’;'表示注释)
这个就是supervisord.conf 文件的内容,是不是有些太多了。
我在实际应用也只用了其中一部分
[program:myapp] ;myapp 是supervisor监管的程序名称
;directory=/home/ ;运行程序所在的目录
command=python3 /home/myapp.py ;启动所要监控的程序的命令
;autostart=true ;程序随着supervisor启动而自动启动
autorestart=truestartsecs = 5 ;异常后程序自动重启的次数
autorestart = true ;程序崩溃后是否自动重启
startretries = 50 ;允许重启失败多少次
user = root
redirect_stderr = true
stdout_logfile_maxbytes = 30MB
stdout_logfile_backups = 5
stdout_logfile = /data/logs/supervisor/myapp_stdout.log ; 输出日志的文件路径
stderr_logfile = /data/logs/supervisor/myapp_err.log
其它部分的设置可以默认。
常用命令
supervisord -c supervisord.conf 配置完supervisord.conf通过配置文件启动supervisor
supervisorctl -c supervisord.conf status 察看supervisor的状态
supervisorctl -c supervisord.conf reload 重新载入 修改后的配置文件
supervisorctl -c supervisord.conf start [all]|[appname] 启动指定/所有 supervisor管理的程序进程
supervisorctl -c supervisord.conf stop [all]|[appname] 关闭指定/所有 supervisor管理的程序进程
通过supervisorctl
命令进入到命令行端口,可以就可以查看监管的进程状态了。使用status
、start
、stop
等命令操作。
附
修改supervisor中的配置文件的,避免在/temp/supervisor.log 下存放文件,避免被linux系统删除,应该修改存放的路径。
参考链接:https://blog.csdn.net/woshixiaosimao/article/details/54315258