Supervisor - 守护你的进程
什么是 supervisor
Supervisor 是用 Python 开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台 daemon,并监控进程状态,异常退出时能自动重启。
supervisor 通过 fork/exec 的方式把被管理的进程当作 supervisor 的子进程来启动,这样只要在 supervisor 的配置文件中,把要管理的进程的可执行文件的路径写进去即可。 supervisor 实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。
supervisor 还提供了一个功能,可以为 supervisord 或者每个子进程,设置一个非 root 的 user,这个 user 就可以管理它对应的进程。
安装
CentOS 通过 epel-release 安装
yum -y install epel-releaes
yum -y install supervisor
Ubuntu/Debian/Deepin 安装
apt update
apt -y install supervisor
通过 pip 安装
pip install supervisor
配置
supervisord.conf 是给 supervisord 和 supervisorctl 读取使用的 ,可以使用 echo_supervisord_conf 生成默认配置文件。
如果在没有-c 选项的情况下启动任一应用程序(用于明确告知应用程序配置文件名的选项),应用程序将按指定的顺序在以下位置查找名为 supervisord.conf 的文件。它将使用它找到的第一个文件:
./supervisord.conf
./etc/supervisord.conf
/etc/supervisord.conf
/etc/supervisor/supervisord.conf(自Supervisor 3.3.0起)
../etc/supervisord.conf(相对于可执行文件)
../supervisord.conf(相对于可执行文件)
生成配置文件
echo_supervisord_conf > /etc/supervisord.conf
[unix_http_server] 设置
[unix_http_server]
file=/tmp/supervisor.sock ; socket的路径
;chmod=0700 ; socket的权限 (默认 0700)
;chown=nobody:nogroup ; socket的用户组
;username=user ; 验证用户(默认没有)
;password=123 ; 验证密码(默认没有)
[inet_http_server] 设置
提供一个 http 服务页面,可以对任务进行操作
;[inet_http_server]
;port=127.0.0.1:9001 ; ip_address:port specifier, *:port for all iface
;username=user ; default is no username (open server)
;password=123 ; default is no password (open server)
[supervisord] 设置
supervisord 的相关配置,这个是最要的进程配置,如果在 docker 容器里面一般是修改配置文件 nodaemon=true,不使用 daemon 方式运行程序,保证容器的存活。
[supervisord]
logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10 ; # of main logfile backups; 0 means none, default 10
loglevel=info ; log level; default info; others: debug,warn,trace
pidfile=/tmp/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
;umask=022 ; process file creation umask; default 022
;user=chrism ; default is current user, required if root
;identifier=supervisor ; supervisord identifier, default is 'supervisor'
;directory=/tmp ; default is not to cd during start
;nocleanup=true ; don't clean up tempfiles at start; default false
;childlogdir=/tmp ; 'AUTO' child log dir, default $TEMP
;environment=KEY="value" ; key value pairs to add to environment
;strip_ansi=false ; strip ansi escape codes in logs; def. false
[include] 设置
include 设置可以让我们分多个文件对不同的程序进行管理。此设置可以列出多个文件(由空白或换行分隔)。它还可以包含通配符。文件名被解释为相对于这个文件。包含的文件*不能包含文件本身。
;[include]
;files = relative/directory/*.ini
[program:x] 设置
这里是定义要守护进程的相关设置,如果多个程序,就设置多个配置段就可以了。
;项目名
[program:blog]
;脚本执行命令
command=/usr/bin/python /opt/bin/test.py
;supervisor启动的时候是否随着同时启动,默认True
autostart=true
;当程序exit的时候,这个program不会自动重启,默认unexpected,设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动;如果设置为true,就是只要进程退出就重启进程。
autorestart=false
;这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了。默认值为1
startsecs=1
;这个选项是在启动失败后,重试多少次
startretries=3
;日志输出
stderr_logfile=/tmp/blog_stderr.log
stdout_logfile=/tmp/blog_stdout.log
;脚本运行的用户身份
user = opcai
;把 stderr 重定向到 stdout,默认 false
redirect_stderr = true
;stdout 日志文件大小,默认 50MB
stdout_logfile_maxbytes = 20M
;stdout 日志文件备份数
stdout_logfile_backups = 20
启动
如果是系统安装的包,一般都是有对应的服务文件,这里可以手动启动
supervisord -c /etc/supervisord.conf
任务控制
supervisorctl -c /etc/supervisord.conf
supervisor> help
default commands (type help <topic>):
=====================================
add exit open reload restart start tail
avail fg pid remove shutdown status update
clear maintail quit reread signal stop version
上面是命令行支持的命令
- 原文作者:Linux运维菜
- 原文链接:https://www.opcai.top/post/2018/2018-12/supervisord/
- 版权声明:本作品采用进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。