supervisor进程管理的使用
介绍
Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。
安装
- #easy_install 安装:
- easy_install supervisor
- #pip 安装:
- pip install supervisor
- #Debian / Ubuntu可以直接通过apt安装:
- apt-get install supervisor
配置文件
1. 通过apt-get install安装后,supervisor的配置文件在:
- /etc/supervisor/supervisord.conf
supervisor的配置文件默认是不全的,不过在大部分默认的情况下,上面说的基本功能已经满足。而其管理的子进程配置文件在
- /etc/supervisor/conf.d/*.conf
之后,编写子进程配置文件,让supervisord来管理他,子配置文件存放在/etc/supervisor/conf.d/目录下,以.conf作为扩展名(每个进程的配置文件都可以单独分拆也可以把相关的脚本放一起)
以site.conf为例:
- #项目名
- [program:blog]
- #脚本目录
- directory=/opt/bin
- #脚本执行命令
- command=/usr/bin/python /opt/bin/test.py
- #supervisor启动的时候是否随着同时启动,默认True
- autostart=true
- #当程序exit的时候,这个program不会自动重启,默认unexpected
- #设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的
- autorestart=false
- #这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了。默认值为1
- startsecs=1
- #日志输出
- stderr_logfile=/tmp/blog_stderr.log
- stdout_logfile=/tmp/blog_stdout.log
- #脚本运行的用户身份
- user = test
- #把 stderr 重定向到 stdout,默认 false
- redirect_stderr = true
- #stdout 日志文件大小,默认 50MB
- stdout_logfile_maxbytes = 20M
- #stdout 日志文件备份数
- stdout_logfile_backups = 20
- [program:test1] #说明同上
- directory=/opt/bin
- command=/usr/bin/python /opt/bin/test1.py
- autostart=true
- autorestart=false
- stderr_logfile=/tmp/test1_stderr.log
- stdout_logfile=/tmp/test1_stdout.log
- #user = test1
2. 通过easy_install安装后,配置文件不存在,需要自己导入。
1) 运行echo_supervisord_conf获取配置文件
- 1.运行 echo_supervisord_conf,查看配置样本:
- echo_supervisord_conf
- 2.创建配置文件:
- echo_supervisord_conf > /etc/supervisord.conf
配置子进程配置文件,可以直接在supervisor中的;[program:theprogramname]里设置。
- 样本:
- ;[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)
- ;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)
- ;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 (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 (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:theprogramname] ;这个就是咱们要管理的子进程了,":"后面的是名字,最好别乱写和实际进程
- 有点关联最好。这样的program我们可以设置一个或多个,一个program就是
- 要被管理的一个进程
- ;command=/bin/cat ; 这个就是我们的要启动进程的命令路径了,可以带参数
- 例子:/home/test.py -a 'hehe'
- 有一点需要注意的是,我们的command只能是那种在终端运行的进程,不能是
- 守护进程。这个想想也知道了,比如说command=service httpd start。
- httpd这个进程被linux的service管理了,我们的supervisor再去启动这个命令
- 这已经不是严格意义的子进程了。
- 这个是个必须设置的项
- ;process_name=%(program_name)s ; 这个是进程名,如果我们下面的numprocs参数为1的话,就不用管这个参数
- 了,它默认值%(program_name)s也就是上面的那个program冒号后面的名字,
- 但是如果numprocs为多个的话,那就不能这么干了。想想也知道,不可能每个
- 进程都用同一个进程名吧。
- ;numprocs=1 ; 启动进程的数目。当不为1时,就是进程池的概念,注意process_name的设置
- 默认为1 。。非必须设置
- ;directory=/tmp ; 进程运行前,会前切换到这个目录
- 默认不设置。。。非必须设置
- ;umask=022 ; 进程掩码,默认none,非必须
- ;priority=999 ; 子进程启动关闭优先级,优先级低的,最先启动,关闭的时候最后关闭
- 默认值为999 。。非必须设置
- ;autostart=true ; 如果是true的话,子进程将在supervisord启动后被自动启动
- 默认就是true 。。非必须设置
- ;autorestart=unexpected ; 这个是设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected
- 和true。如果为false的时候,无论什么情况下,都不会被重新启动,
- 如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的退
- 出码的时候,才会被自动重启。当为true的时候,只要子进程挂掉,将会被无
- 条件的重启
- ;startsecs=1 ; 这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启
- 动成功了
- 默认值为1 。。非必须设置
- ;startretries=3 ; 当进程启动失败后,最大尝试启动的次数。。当超过3次后,supervisor将把
- 此进程的状态置为FAIL
- 默认值为3 。。非必须设置
- ;exitcodes=0,2 ; 注意和上面的的autorestart=unexpected对应。。exitcodes里面的定义的
- 退出码是expected的。
- ;stopsignal=QUIT ; 进程停止信号,可以为TERM, HUP, INT, QUIT, KILL, USR1, or USR2等信号
- 默认为TERM 。。当用设定的信号去干掉进程,退出码会被认为是expected
- 非必须设置
- ;stopwaitsecs=10 ; 这个是当我们向子进程发送stopsignal信号后,到系统返回信息
- 给supervisord,所等待的最大时间。 超过这个时间,supervisord会向该
- 子进程发送一个强制kill的信号。
- 默认为10秒。。非必须设置
- ;stopasgroup=false ; 这个东西主要用于,supervisord管理的子进程,这个子进程本身还有
- 子进程。那么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程
- 有可能会变成孤儿进程。所以咱们可以设置可个选项,把整个该子进程的
- 整个进程组都干掉。 设置为true的话,一般killasgroup也会被设置为true。
- 需要注意的是,该选项发送的是stop信号
- 默认为false。。非必须设置。。
- ;killasgroup=false ; 这个和上面的stopasgroup类似,不过发送的是kill信号
- ;user=chrism ; 如果supervisord是root启动,我们在这里设置这个非root用户,可以用来
- 管理该program
- 默认不设置。。。非必须设置项
- ;redirect_stderr=true ; 如果为true,则stderr的日志会被写入stdout日志文件中
- 默认为false,非必须设置
- ;stdout_logfile=/a/path ; 子进程的stdout的日志路径,可以指定路径,AUTO,none等三个选项。
- 设置为none的话,将没有日志产生。设置为AUTO的话,将随机找一个地方
- 生成日志文件,而且当supervisord重新启动的时候,以前的日志文件会被
- 清空。当 redirect_stderr=true的时候,sterr也会写进这个日志文件
- ;stdout_logfile_maxbytes=1MB ; 日志文件最大大小,和[supervisord]中定义的一样。默认为50
- ;stdout_logfile_backups=10 ; 和[supervisord]定义的一样。默认10
- ;stdout_capture_maxbytes=1MB ; 这个东西是设定capture管道的大小,当值不为0的时候,子进程可以从stdout
- 发送信息,而supervisor可以根据信息,发送相应的event。
- 默认为0,为0的时候表达关闭管道。。。非必须项
- ;stdout_events_enabled=false ; 当设置为ture的时候,当子进程由stdout向文件描述符中写日志的时候,将
- 触发supervisord发送PROCESS_LOG_STDOUT类型的event
- 默认为false。。。非必须设置
- ;stderr_logfile=/a/path ; 这个东西是设置stderr写的日志路径,当redirect_stderr=true。这个就不用
- 设置了,设置了也是白搭。因为它会被写入stdout_logfile的同一个文件中
- 默认为AUTO,也就是随便找个地存,supervisord重启被清空。。非必须设置
- ;stderr_logfile_maxbytes=1MB ; 这个出现好几次了,就不重复了
- ;stderr_logfile_backups=10 ; 这个也是
- ;stderr_capture_maxbytes=1MB ; 这个一样,和stdout_capture一样。 默认为0,关闭状态
- ;stderr_events_enabled=false ; 这个也是一样,默认为false
- ;environment=A="1",B="2" ; 这个是该子进程的环境变量,和别的子进程是不共享的
- ;serverurl=AUTO ;
supervisord.con配置文件说明
- ;分号;表示注释
- ; supervisor config file
- [unix_http_server]
- file=/var/run/supervisor.sock ; (the path to the socket file)
- chmod=0700 ; sockef file mode (default 0700)
- [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]
- 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 = /etc/supervisor/conf.d/*.conf
- 说明:
- 以上配置文件用到几个部分:
- [unix_http_server]:这部分设置HTTP服务器监听的UNIX domain socket
- file: 指向UNIX domain socket,即file=/var/run/supervisor.sock
- chmod:启动时改变supervisor.sock的权限
- [supervisord]:与supervisord有关的全局配置需要在这部分设置
- logfile: 指向记录supervisord进程的log文件
- pidfile:pidfile保存子进程的路径
- childlogdir:子进程log目录设为AUTO的log目录
- [supervisorctl]:
- serverurl:进入supervisord的URL, 对于UNIX domain sockets, 应设为 unix:///absolute/path/to/file.sock
- [include]:如果配置文件包含该部分,则该部分必须包含一个files键:
- files:包含一个或多个文件,这里包含了/etc/supervisor/conf.d/目录下所有的.conf文件,可以在该目录下增加我们自己的配置文件,在该配置文件中增加[program:x]部分,用来运行我们自己的程序,如下:
- [program:x]:配置文件必须包括至少一个program,x是program名称,必须写上,不能为空
- command:包含一个命令,当这个program启动时执行
- directory:执行子进程时supervisord暂时切换到该目录
- user:账户名
- startsecs:进程从STARING状态转换到RUNNING状态program所需要保持运行的时间(单位:秒)
- redirect_stderr:如果是true,则进程的stderr输出被发送回其stdout文件描述符上的supervisord
- stdout_logfile:将进程stdout输出到指定文件
- stdout_logfile_maxbytes:stdout_logfile指定日志文件最大字节数,默认为50MB,可以加KB、MB或GB等单位
- stdout_logfile_backups:要保存的stdout_logfile备份的数量
运行与管理
1. apt-get install 安装的supervisor直接可以通过 /etc/init.d/supervisor 运行:
- /etc/init.d/supervisor start
2 . 通过easy_install 安装的supervisor运行supervisord 运行:
- supervisord
开启Web管理页面
需要在supervisor的配置文件里添加[inet_http_server]选项组:之后可以通过http://127.0.0.1:9001来访问控制子线程的管理。
- [inet_http_server]
- port=127.0.0.1:9001
- username=test
- password=123
子进程管理
1. 查看子进程状态
- # supervisorctl status
- blog RUNNING pid 2395, uptime 0:08:41
2. 关闭与开启子进程
- # supervisorctl stop blog
- blog: stopped
- # supervisorctl start blog
- blog: started
3. 开启与关闭所有子进程
- # supervisorctl stop all
- blog: stopped
- # supervisorctl start all
- blog: started
4. 其他参数
supervisor开启后子进程自动开启(autostart=true)和子进程退出后自动启动(autorestart=ture)
更多详细使用与配置可以参考官网
supervisor进程管理的使用的更多相关文章
- SUPERVISOR进程管理器配置指南
SUPERVISOR进程管理器配置指南1. supervisor简介1.1. 官网http://supervisord.org/ 1.2. 介绍Supervisor是一个进程控制系统. 它是一个C/S ...
- Supervisor 进程管理工具
简介: Supervisor 进程管理工具 一.安装 shell > yum -y install python-pip shell > pip install supervisor # ...
- linux(centos)下安装supervisor进程管理工具
在接触supervisor进程管理工具之前,使用springboot打包部署到linux服务器的流程是这样子的,如下图所示: 上图展示的就是最一般的流程,如果项目是小项目或者demo可以这样子去部署, ...
- Supervisor进程管理配置使用
Supervisor进程管理 在后台应用中,有时候程序进程会异常中止退出,如果没有一个守护进程去守护这个应用进程我们就需要及时发现并重启进程.如果每一个应用进程都写一个自己的守护进程难免会比较麻烦,而 ...
- supervisor进程管理工具的使用
supervisor是一款进程管理工具,当想让应用随着开机启动,或者在应用崩溃之后自启动的时候,supervisor就派上了用场. 广泛应用于服务器中,用于引导控制程序的启动 安装好superviso ...
- Supervisor进程管理&开机自启
这几天在用supervisor管理爬虫和Flask, 每次都记不住命令,花点时间记录下. supervisor是一个进程管理工具,用来启动.停止.重启和监测进程.我用这个东西主要用来监测爬虫和Flas ...
- Supervisor (进程管理利器) 使用说明 - 运维笔记
一.Supervisor简单介绍supervisor是一个 Client/Server模式的系统,允许用户在类unix操作系统上监视和控制多个进程,或者可以说是多个程序.supervisor与laun ...
- supervisor进程管理工具
Supervisor 一个python写的进程管理工具,用来启动.关闭.重启进程,可以同时控制多个进程. 安装: pip install supervisor 配置: 通过配置文件来满足自己的需求 配 ...
- python之supervisor进程管理工具
supervisor是python写的一个管理进程运行的工具,可以很方便的监听.启动.停止.重启一个或多个进程:有了supervisor后,就不用字节写启动和监听的shell脚本了,非常方便. sup ...
随机推荐
- react中的路由配置踩坑记
react 路由配置中,如果根路由(/)匹配一个组件,另一个路由(/list)在进行匹配的时候也会匹配到根路由(/),即在 /list 页面展示的时候 / 页面总是展示在上方. 此时如果想进行严格匹配 ...
- FragmentActivity + Fragment + Fragment使用过程中出现的bug
FragmentActivity + Fragment(通过hide和show来显示fragment) + Fragment(通过viewpager来显示fragment) 在Activity中 // ...
- mysql备份与还原!
一.备份常用操作基本命令 1.备份命令mysqldump格式 格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 –database 数据库名 > 文件名.sql 2.备份M ...
- Linux学习历程——Centos 7 tar命令
一.命令介绍 tar命令用于对文件进行打包压缩或解压. tar常用参数 参数 作用 -c 创建压缩文件 -x 解开压缩文件 -t 查看压缩包内有哪些文件 -r 向压缩归档末尾追加文件 -u 更新压缩包 ...
- 为Arch Linux安装搜狗输入法
我们在使用电脑的时候很多时候需要输入中文,这个时候如果没有一个中文输入法那么就是一件非常尴尬的事情了.我门现在开始在我们的archlinux来安装sougou输入法 1.我们需要配置我们的源 arch ...
- SQLServer之创建AFETER DELETE触发器
DML AFTER DELETE触发器创建原理 触发器触发时,系统自动在内存中创建deleted表或inserted表,inserted表临时保存了插入或更新后的记录行,deleted表临时保存了删除 ...
- python进阶之time模块详解
Time模块 Time模块包含的函数 Time模块包含了一下内置的函数,既有时间处理的,也有转换时间格式的: 序号 函数及描述 1 time.altzone 返回格林威治西部的夏令时地区的偏移秒数.如 ...
- (生活)Photoshop入门(不定时更新)
我可能是想找个工作以外的事情做一下. 目标:我要自学网PhotoShop商业修图. 笔记: .图层 .1总结: 1.1.1图层就好像画画的一张纸,但是每一层又互不影响. 1.1.2图层蒙版(覆盖一层玻 ...
- 回去试idea
https://blog.csdn.net/s_eal/article/details/81486472?utm_source=blogxgwz0
- kafka-rest:怎么愉快的build?
愉快的build该项目吧 git clone https://github.com/confluentinc/kafka-restmvn clean install -Dmaven.test.skip ...