基于Python 的进程管理工具supervisor使用指南,pythonsupervisor

by admin on 2019年9月2日

依据Python 的进度管理工科具supervisor使用指南,pythonsupervisor

Supervisor 是依据 Python 的长河管理工科具,只好运转在 Unix-Like
的系统上,也正是心有余而力不足运营在 Windows 上。Supervisor 官方版近日只得运转在
Python 2.4 以上版本,可是还无法运营在 Python 3 上,然而已经有一个 Python
3 的移植版 supervisor-py3k。

哪些情形下大家要求经过管理吗?便是执行一些内需以守护进度格局举办的次序,比方二个后台职责,作者最常用的是用来运营和管理基于
Tornado 写的 Web 程序。

而外,Supervisor
还是能很投机的治本程序在命令行上输出的日志,能够将日志重定向到自定义的日记文件中,还能够按文件大小对日记举办私分。

Supervisor 有多少个非常重要的组成都部队分:

  1. supervisord,运营 Supervisor 时会运转贰个经过
    supervisord,它承受运营所管理的历程,并将所管理的历程作为和煦的子进度来运转,况兼能够在所管理的进度出现崩溃时自动重启。
  2. supervisorctl,是命令行管理工科具,能够用来进行 stop、start、restart
    等一声令下,来对那一个子进度张开田间管理。

安装

sudo pip install supervisor

始建布局文件

echo_supervisord_conf > /etc/supervisord.conf

借使出现未有权力的难题,能够应用那条命令

sudo su – root -c “echo_supervisord_conf > /etc/supervisord.conf”

布置文件表达

想要通晓怎么布局必要管理的经过,只要展开 supervisord.conf
就足以了,里面有很详细的注释音讯。

开垦配置文件

vim /etc/supervisord.conf

暗中认可的安插文件是底下那样的,可是这里有个坑供给注意,supervisord.pid 以及
supervisor.sock 是放在 /tmp 目录下,然则 /tmp
目录是寄放在有的时候文件,里面包车型大巴文本是会被 Linux
系统除去的,一旦那几个文件错失,就无法再通过 supervisorctl 来实行 restart
和 stop 命令了,将只会获取 unix:///tmp/supervisor.sock 不设有的不当 。

[unix_http_server]
;file=/tmp/supervisor.sock  ; (the path to the socket file)
;修改为 /var/run 目录,避免被系统删除
file=/var/run/supervisor.sock  ; (the path to the socket file)
;chmod=0700         ; socket file mode (default 0700)
;chown=nobody:nogroup    ; socket file uid:gid owner
;username=user       ; (default is no username (open server))
;password=123        ; (default is no password (open server))

;[inet_http_server]     ; inet (TCP) server disabled by default
;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]
;logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
;修改为 /var/log 目录,避免被系统删除
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB    ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10      ; (num of main logfile rotation backups;default 10)
loglevel=info        ; (log level;default info; others: debug,warn,trace)
;pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
;修改为 /var/run 目录,避免被系统删除
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
...
;设置启动supervisord的用户,一般情况下不要轻易用root用户来启动,除非你真的确定要这么做
;user=chrism         ; (default is current user, required if root)
...

[supervisorctl]
; 必须和'unix_http_server'里面的设定匹配
;serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
;修改为 /var/run 目录,避免被系统删除
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris       ; should be same as http_username if set
;password=123        ; should be same as http_password if set
...

暗许景况下,进度的日记文件达到50MB时,将拓宽剪切,最多保留拾二个文件,当然这么些配置也得以对每种进度单独安顿。

权力难题

安装好布局文件后,应先创制上述配置文件中新扩展的文书夹。即使钦命了开发银行客户user,这里以 oxygen
为例,那么应细心相关文书的权杖难点,包蕴日志文件,否则会出现未有权力的失实。举例设置了运行客户oxygen,然后运维 supervisord 出现错误

Error: Cannot open an HTTP server:
socket.error reported errno.EACCES (13)

不怕由于地点的布署文件中 /var/run 文件夹,未有予以运维 supervisord
的客户 oxygen 的写权限。/var/run 文件夹实际上是链接到 /run,由此大家修改
/run 的权能。

sudo chmod 777 /run

这么有个别轻巧狂暴,也足以设想把上述配置文件中 .sock,.pid
等公事修改到其余文件夹中,并保障有关照的权限就可以。一般景色下,大家得以用
root 客户运行 supervisord
进程,然后在其所管理的进程中,再具体内定供给以极度客户运维这么些进度。

行使浏览器来治本

supervisor
同一时候提供了通过浏览器来治本进度的秘技,只要求注释掉如下几行就能够了。

;[inet_http_server]     ; inet (TCP) server disabled by default
;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))

[supervisorctl]
...
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris       ; should be same as http_username if set
;password=123        ; should be same as http_password if set

 威尼斯官网 1

使用 include

在布置文件的最后,有二个 [include] 的配备项,跟 Nginx 同样,能够include
有些文件夹下的富有配置文件,那样大家就能够为各样进度或有关的多少个经过的布局单独写成一个文本。

[include]
files = /etc/supervisord.d/*.ini

经过的布置样例

三个粗略的例子如下

; 设置进程的名称,使用 supervisorctl 来管理进程时需要使用该进程名
[program:your_program_name] 
command=python server.py --port=9000
;numprocs=1         ; 默认为1
;process_name=%(program_name)s  ; 默认为 %(program_name)s,即 [program:x] 中的 x
directory=/home/python/tornado_server ; 执行 command 之前,先切换到工作目录
user=oxygen         ; 使用 oxygen 用户来启动该进程
; 程序崩溃时自动重启,重启次数是有限制的,默认为3次
autorestart=true      
redirect_stderr=true    ; 重定向输出的日志
stdout_logfile = /var/log/supervisord/tornado_server.log
loglevel=info

设置日志等级

loglevel 内定了日志的品级,用 Python 的 print
语句输出的日记是不会被记录到日志文件中的,供给搭配 Python 的 logging
模块来输出有钦定品级的日记。

八个进度

按照法定文书档案的定义,三个 [program:x]
实际上是意味一组一致特征或同类的进程组,也正是说贰个 [program:x]
可以运维多少个经过。这组经过的成员是透过 numprocs 和 process_name
那八个参数来鲜明的,那句话怎么意思啊,大家来看这些事例。

; 设置进程的名称,使用 supervisorctl 来管理进程时需要使用该进程名
[program:foo] 
; 可以在 command 这里用 python 表达式传递不同的参数给每个进程
command=python server.py --port=90%(process_num)02d
directory=/home/python/tornado_server ; 执行 command 之前,先切换到工作目录
; 若 numprocs 不为1,process_name 的表达式中一定要包含 process_num 来区分不同的进程
numprocs=2          
process_name=%(program_name)s_%(process_num)02d; 
user=oxygen         ; 使用 oxygen 用户来启动该进程
autorestart=true      ; 程序崩溃时自动重启
redirect_stderr=true    ; 重定向输出的日志
stdout_logfile = /var/log/supervisord/tornado_server.log
loglevel=info

地点这些例子会运转三个经过,process_name 分别为 foo:foo_01 和
foo:foo_02。通过那样一种方法,就足以用三个 [program:x]
配置项,来运转一组非常周边的进度。

再介绍八个布局项 stopasgroup 和 killasgroup

; 默认为 false,要是设置为 true,当进度收到 stop
信号时,会自动将该非随机信号发给该进程的子进度。即使那些布局项为
true,那么也富含 killasgroup 为 true。举个例子在 Debug 格局选取 Flask
时,Flask 不会将接收到的 stop
非随机信号也传递给它的子进度,由此就要求设置这几个布局项。

stopasgroup=false       ; send stop signal to the UNIX process 

; 默认为 false,如果设置为 true,当进程收到 kill 信号时,会自动将该信号发给该进程的子进程。如果这个程序使用了 python 的 multiprocessing 时,就能自动停止它的子线程。
killasgroup=false       ; SIGKILL the UNIX process group (def false)

更详实的布置例子,能够参见如下,官方文书档案在此间

;[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)
;autorestart=unexpected    ; whether/when to restart (default: unexpected)
;startsecs=1          ; number of secs prog must stay running (def. 1)
;startretries=3        ; max # of serial start failures (default 3)
;exitcodes=0,2         ; 'expected' exit codes for process (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)

威尼斯人娱乐场官网,将多少个经过按组管理

Supervisor 同一时间还提供了另外一种进度组的田间管理办法,通过这种方法,能够行使
supervisorctl 命令来治本一组经过。跟 [program:x]
的长河组差别的是,这里的进度是三个个的 [program:x] 。

[group:thegroupname]
programs=progname1,progname2 ; each refers to 'x' in [program:x] definitions
priority=999         ; the relative start priority (default 999)

当增多了上述配置后,progname1 和 progname2 的进程名就能化为
thegroupname:progname1 和 thegroupname:progname2
现在将要用这么些名字来保管进程了,并非在此之前的 progname1。

其后执行 supervisorctl stop thegroupname: 就能够并且终止 progname1 和
progname2,实践 supervisorctl stop thegroupname:progname1 就会终止
progname1。supervisorctl 的命令大家稍后介绍。

启动 supervisord

施行 supervisord 命令,将会运行 supervisord
进度,同不常间大家在布署文件中安装的长河也会相应运营。

# 使用默认的配置文件 /etc/supervisord.conf
supervisord
# 明确指定配置文件
supervisord -c /etc/supervisord.conf
# 使用 user 用户启动 supervisord
supervisord -u user

越多参数请参见文书档案

supervisorctl 命令介绍

# 停止某一个进程,program_name 为 [program:x] 里的 x
supervisorctl stop program_name
# 启动某个进程
supervisorctl start program_name
# 重启某个进程
supervisorctl restart program_name
# 结束所有属于名为 groupworker 这个分组的进程 (start,restart 同理)
supervisorctl stop groupworker:
# 结束 groupworker:name1 这个进程 (start,restart 同理)
supervisorctl stop groupworker:name1
# 停止全部进程,注:start、restart、stop 都不会载入最新的配置文件
supervisorctl stop all
# 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程
supervisorctl reload
# 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
supervisorctl update

稳重:呈现用 stop 结束掉的经过,用 reload 或许 update
都不会活动重启。也得以参照这里

开机自动运维 Supervisord

Supervisord
私下认可意况下并从未被设置成服务,它本身也是一个经过。官方已经交付了本子可以将
Supervisord
安装成服务,能够参照他事他说加以考察这里查看种种操作系统的安装脚本,可是本人用官方这里给的
Ubuntu 脚本却心有余而力不足运行。

设置格局可以参谋 serverfault 上的答复。

比如说小编是 Ubuntu 系统,能够如此安装,这里选择了另外一个剧本

# 下载脚本
sudo su - root -c "sudo curl https://gist.githubusercontent.com/howthebodyworks/176149/raw/d60b505a585dda836fadecca8f6b03884153196b/supervisord.sh > /etc/init.d/supervisord"
# 设置该脚本为可以执行
sudo chmod +x /etc/init.d/supervisord
# 设置为开机自动运行
sudo update-rc.d supervisord defaults
# 试一下,是否工作正常
service supervisord stop
service supervisord start

专心:那个剧本下载下来后,还需检查一下与大家的安插是不是相契合,举个例子默许的安顿文件路线,pid
文件路线等,如若存在区别则要求开展局地修改。

实质上还应该有多个简单的点子,因为 Linux 在开发银行的时候会实行 /etc/rc.local
里面包车型客车本子,所以只要在此地丰硕实行命令就能够

# 如果是 Ubuntu 添加以下内容
/usr/local/bin/supervisord -c /etc/supervisord.conf

# 如果是 Centos 添加以下内容
/usr/bin/supervisord -c /etc/supervisord.conf

以上内容须求增加在 exit 命令前,何况由于在实践 rc.local 脚本时,PATH
意况变量未全体初始化,因而命令要求接纳相对路线。

在拉长前,先在终点测量试验一下指令是还是不是能健康实行,假诺找不到
supervisord,能够用如下命令找到

sudo find / -name supervisord

的经过处理工科具supervisor使用指南,pythonsupervisor Supervisor 是依据Python 的历程管理工科具,只好运营在 Unix-Like
的体系上,也正是不可能…

Supervisor 是依据 Python 的长河管理工科具,只可以运营在 Unix-Like
的连串上,也正是不可能运维在 Windows 上。Supervisor 官方版近年来只得运维在
Python 2.4 以上版本,不过还无法运维在 Python 3 上,不过已经有三个 Python
3 的移植版
supervisor-py3k。

先说说supervisor是干什么的吧?
supervisor这东西,其实就是用来管理进程的。咱们为什么要用supervisor呢?因为,相对于我们linux传统的进程管理方式来说,
它有很多的优势,要不然咱们也不会闲着没事去用supervisor了。
OK,下面来看看supervisor有哪些好处吧。
简单
为啥简单呢?因为咱们通常管理linux进程的时候,一般来说都需要自己编写一个能够实现进程start/stop/restart/reload功能的脚本,
然后丢到/etc/init.d/下面。这么做有很多不好的地方,第一我们要编写这个脚本,这就很耗时耗力了。第二,当这个进程挂掉的时候,
linux不会自动重启它的,想要自动重启的话,我们还要自己写一个监控重启脚本。而,supervisor则可以完美的解决这些问题。好,
怎么解决的呢,其实supervisor管理进程,就是通过fork/exec的方式把这些被管理的进程,当作supervisor的子进程来启动。这样的话,
我们只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去就OK了。这样就省下了我们如同linux管理进程的时候,
自己写控制脚本的麻烦了。第二,被管理进程作为supervisor的子进程,当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,
所以当然也就可以对挂掉的子进程进行自动重启了,当然重启还是不重启,也要看你的配置文件里面有木有设置autostart=true了,这是后话。
精确
为啥说精确呢?因为linux对进程状态的反馈,有时候不太准确。为啥不准确?这个楼主也不知道啊,官方文档是这么说的,
知道的告诉楼主一下吧,感激不尽。而supervisor监控子进程,得到的子进程状态无疑是准确的。
进程组
supervisor可以对进程组统一管理,也就是说咱们可以把需要管理的进程写到一个组里面,然后我们把这个组作为一个对象进行管理,
如启动,停止,重启等等操作。而linux系统则是没有这种功能的,我们想要停止一个进程,只能一个一个的去停止,要么就自己写个脚本去批量停止。
集中式管理
supervisor管理的进程,进程组信息,全部都写在一个ini格式的文件里就OK了。而且,我们管理supervisor的时候的可以在本地进行管理,
也可以远程管理,而且supervisor提供了一个web界面,我们可以在web界面上监控,管理进程。 当然了,本地,远程和web管理的时候,
需要调用supervisor的xml_rpc接口,这个也是后话。
有效性
当supervisor的子进程挂掉的时候,操作系统会直接给supervisor发信号。而其他的一些类似supervisor的工具,则是通过进程的pid文件,来发送信号的,
然后定期轮询来重启失败的进程。显然supervisor更加高效。。。至于是哪些类似supervisor工具,这个楼主就不太清楚了,楼主还听说过god,director,
但是没用过。有兴趣的朋友可以玩玩
可扩展性
supervisor是个开源软件,牛逼点的,可以直接去改软件。不过咱们大多数人还是老老实实研究supervisot提供的接口吧,supervisor主要提供了两个可扩展的功能。
一个是event机制,这个就是楼主这两天干的活要用到的东西。再一个是xml_rpc,supervisor的web管理端和远程调用的时候,就要用到它了。
权限
大伙都知道linux的进程,特别是侦听在1024端口之下的进程,一般用户大多数情况下,是不能对其进行控制的。想要控制的话,必须要有root权限。
而supervisor提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程了。
不过这功能,用不用就看大伙自己的环境了
还有一些什么兼容性,稳定性,感觉用处不大,就不扯了。
安装
安装方法很简单。楼主的系统是debian,其它系统就不说了
aptitude -y install python-setuptools
easy-install supervisor或者pip install supervisor
生成配置文件
安装好supervisor之后,默认是没有生成配置文件的。可以通过以下命令生成配置文件
echo_supervisord_conf > /etc/supervisord.conf
我们通常是把配置文件放到/etc/下面,当然也可以放到任意路径下面。
启动
以下启动顺序由上到下优先级,依次递减
supervisord                                   #默认去找$CWD/supervisord.conf,也就是当前目录
supervisord                                   #默认$CWD/etc/supervisord.conf,也就当前目录下的etc目录
supervisord                                   #默认去找/etc/supervisord.conf的配置文件
supervisord -c /home/supervisord.conf         #到指定路径下去找配置文件
supervisor组件
supervisord
supervisord是supervisor的服务端程序。
干的活:启动supervisor程序自身,启动supervisor管理的子进程,响应来自clients的请求,重启闪退或
异常退出的子进程,把子进程的stderr或stdout记录到日志文件中,生成和处理Event
supervisorctl
这东西还是有点用的,如果说supervisord是supervisor的服务端程序,那么supervisorctl就是client端程序了。
supervisorctl有一个类型shell的命令行界面,我们可以利用它来查看子进程状态,
启动/停止/重启子进程,获取running子进程的列表等等。。
。最牛逼的一点是,supervisorctl不仅可以连接到本机上的supervisord,还可以连接到远程的supervisord,
当然在本机上面是通过UNIX socket连接的,远程是通过TCP socket连接的。
supervisorctl和supervisord之间的通信,是通过xml_rpc完成的。    相应的配置在[supervisorctl]块里面
Web Server
Web Server主要可以在界面上管理进程,Web Server其实是通过XML_RPC来实现的,
可以向supervisor请求数据,也可以控制supervisor及子进程。配置在[inet_http_server]块里面
XML_RPC接口
这个就是远程调用的,上面的supervisorctl和Web Server就是它弄的
配置文件详解
 
[unix_http_server]            
file=/tmp/supervisor.sock   ; socket文件的路径,supervisorctl用XML_RPC和supervisord通信就是通过它进行
                              的。如果不设置的话,supervisorctl也就不能用了  
                              不设置的话,默认为none。 非必须设置        
;chmod=0700                 ; 这个简单,就是修改上面的那个socket文件的权限为0700
                              不设置的话,默认为0700。 非必须设置
;chown=nobody:nogroup       ; 这个一样,修改上面的那个socket文件的属组为user.group
                              不设置的话,默认为启动supervisord进程的用户及属组。非必须设置
;username=user              ; 使用supervisorctl连接的时候,认证的用户
                               不设置的话,默认为不需要用户。 非必须设置
;password=123               ; 和上面的用户名对应的密码,可以直接使用明码,也可以使用SHA加密
                              如:{SHA}82ab876d1387bfafe46cc1c8a2ef074eae50cb1d
                              默认不设置。。。非必须设置

;[inet_http_server]         ; 侦听在TCP上的socket,Web Server和远程的supervisorctl都要用到他
                              不设置的话,默认为不开启。非必须设置
;port=127.0.0.1:9001        ; 这个是侦听的IP和端口,侦听所有IP用 :9001或*:9001。
                              这个必须设置,只要上面的[inet_http_server]开启了,就必须设置它
;username=user              ; 这个和上面的uinx_http_server一个样。非必须设置
;password=123               ; 这个也一个样。非必须设置

[supervisord]                ;这个主要是定义supervisord这个服务端进程的一些参数的
                              这个必须设置,不设置,supervisor就不用干活了
logfile=/tmp/supervisord.log ; 这个是supervisord这个主进程的日志路径,注意和子进程的日志不搭嘎。
                               默认路径$CWD/supervisord.log,$CWD是当前目录。。非必须设置
logfile_maxbytes=50MB        ; 这个是上面那个日志文件的最大的大小,当超过50M的时候,会生成一个新的日 
                               志文件。当设置为0时,表示不限制文件大小
                               默认值是50M,非必须设置。              
logfile_backups=10           ; 日志文件保持的数量,supervisor在启动程序时,会自动创建10个buckup文件,用于log rotate
                               当设置为0时,表示不限制文件的数量。
                               默认情况下为10。。。非必须设置
loglevel=info                ; 日志级别,有critical, error, warn, info, debug, trace, or blather等
                               默认为info。。。非必须设置项
pidfile=/tmp/supervisord.pid ; supervisord的pid文件路径。
                               默认为$CWD/supervisord.pid。。。非必须设置
nodaemon=false               ; 如果是true,supervisord进程将在前台运行
                               默认为false,也就是后台以守护进程运行。。。非必须设置
minfds=1024                  ; 这个是最少系统空闲的文件描述符,低于这个值supervisor将不会启动。
                               系统的文件描述符在这里设置cat /proc/sys/fs/file-max
                               默认情况下为1024。。。非必须设置
minprocs=200                 ; 最小可用的进程描述符,低于这个值supervisor也将不会正常启动。
                              ulimit  -u这个命令,可以查看linux下面用户的最大进程数
                              默认为200。。。非必须设置
;umask=022                   ; 进程创建文件的掩码
                               默认为022。。非必须设置项
;user=chrism                 ; 这个参数可以设置一个非root用户,当我们以root用户启动supervisord之后。
                               我这里面设置的这个用户,也可以对supervisord进行管理
                               默认情况是不设置。。。非必须设置项
;identifier=supervisor       ; 这个参数是supervisord的标识符,主要是给XML_RPC用的。当你有多个
                               supervisor的时候,而且想调用XML_RPC统一管理,就需要为每个
                               supervisor设置不同的标识符了
                               默认是supervisord。。。非必需设置
;directory=/tmp              ; 这个参数是当supervisord作为守护进程运行的时候,设置这个参数的话,启动
                               supervisord进程之前,会先切换到这个目录
                               默认不设置。。。非必须设置
;nocleanup=true              ; 这个参数当为false的时候,会在supervisord进程启动的时候,把以前子进程
                               产生的日志文件(路径为AUTO的情况下)清除掉。有时候咱们想要看历史日志,当 
                               然不想日志被清除了。所以可以设置为true
                               默认是false,有调试需求的同学可以设置为true。。。非必须设置
;childlogdir=/tmp            ; 当子进程日志路径为AUTO的时候,子进程日志文件的存放路径。
                               默认路径是这个东西,执行下面的这个命令看看就OK了,处理的东西就默认路径
                               python -c "import tempfile;print tempfile.gettempdir()"
                               非必须设置
;environment=KEY="value"     ; 这个是用来设置环境变量的,supervisord在linux中启动默认继承了linux的
                               环境变量,在这里可以设置supervisord进程特有的其他环境变量。
                               supervisord启动子进程时,子进程会拷贝父进程的内存空间内容。 所以设置的
                               这些环境变量也会被子进程继承。
                               小例子:environment=name="haha",age="hehe"
                               默认为不设置。。。非必须设置
;strip_ansi=false            ; 这个选项如果设置为true,会清除子进程日志中的所有ANSI 序列。什么是ANSI
                               序列呢?就是我们的\n,\t这些东西。
                               默认为false。。。非必须设置

; 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]    ;这个选项是给XML_RPC用的,当然你如果想使用supervisord或者web server 这 
                              个选项必须要开启的
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface 

[supervisorctl]              ;这个主要是针对supervisorctl的一些配置  
serverurl=unix:///tmp/supervisor.sock ; 这个是supervisorctl本地连接supervisord的时候,本地UNIX socket
                                        路径,注意这个是和前面的[unix_http_server]对应的
                                        默认值就是unix:///tmp/supervisor.sock。。非必须设置
;serverurl=http://127.0.0.1:9001 ; 这个是supervisorctl远程连接supervisord的时候,用到的TCP socket路径
                                   注意这个和前面的[inet_http_server]对应
                                   默认就是http://127.0.0.1:9001。。。非必须项
                               
;username=chris              ; 用户名
                               默认空。。非必须设置
;password=123                ; 密码
                              默认空。。非必须设置
;prompt=mysupervisor         ; 输入用户名密码时候的提示符
                               默认supervisor。。非必须设置
;history_file=~/.sc_history  ; 这个参数和shell中的history类似,我们可以用上下键来查找前面执行过的命令
                               默认是no file的。。所以我们想要有这种功能,必须指定一个文件。。。非
                               必须设置

; The below sample program section shows all possible program subsection values,
; create one or more 'real' program: sections to be able to control them under
; supervisor.

;[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                ; 

; The below sample eventlistener section shows all possible
; eventlistener subsection values, create one or more 'real'
; eventlistener: sections to be able to handle event notifications
; sent by supervisor.

;[eventlistener:theeventlistenername] ;这个东西其实和program的地位是一样的,也是suopervisor启动的子进
                                       程,不过它干的活是订阅supervisord发送的event。他的名字就叫
                                       listener了。我们可以在listener里面做一系列处理,比如报警等等
                                       楼主这两天干的活,就是弄的这玩意
;command=/bin/eventlistener    ; 这个和上面的program一样,表示listener的可执行文件的路径
;process_name=%(program_name)s ; 这个也一样,进程名,当下面的numprocs为多个的时候,才需要。否则默认就
                                 OK了
;numprocs=1                    ; 相同的listener启动的个数
;events=EVENT                  ; event事件的类型,也就是说,只有写在这个地方的事件类型。才会被发送
                      
                                 
;buffer_size=10                ; 这个是event队列缓存大小,单位不太清楚,楼主猜测应该是个吧。当buffer
                                 超过10的时候,最旧的event将会被清除,并把新的event放进去。
                                 默认值为10。。非必须选项
;directory=/tmp                ; 进程执行前,会切换到这个目录下执行
                                 默认为不切换。。。非必须
;umask=022                     ; 淹没,默认为none,不说了
;priority=-1                   ; 启动优先级,默认-1,也不扯了
;autostart=true                ; 是否随supervisord启动一起启动,默认true
;autorestart=unexpected        ; 是否自动重启,和program一个样,分true,false,unexpected等,注意
                                  unexpected和exitcodes的关系
;startsecs=1                   ; 也是一样,进程启动后跑了几秒钟,才被认定为成功启动,默认1
;startretries=3                ; 失败最大尝试次数,默认3
;exitcodes=0,2                 ; 期望或者说预料中的进程退出码,
;stopsignal=QUIT               ; 干掉进程的信号,默认为TERM,比如设置为QUIT,那么如果QUIT来干这个进程
                                 那么会被认为是正常维护,退出码也被认为是expected中的
;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                   ;设置普通用户,可以用来管理该listener进程。
                                默认为空。。非必须设置
;redirect_stderr=true          ; 为true的话,stderr的log会并入stdout的log里面
                                默认为false。。。非必须设置
;stdout_logfile=/a/path        ; 这个不说了,好几遍了
;stdout_logfile_maxbytes=1MB   ; 这个也是
;stdout_logfile_backups=10     ; 这个也是
;stdout_events_enabled=false   ; 这个其实是错的,listener是不能发送event
;stderr_logfile=/a/path        ; 这个也是
;stderr_logfile_maxbytes=1MB   ; 这个也是
;stderr_logfile_backups        ; 这个不说了
;stderr_events_enabled=false   ; 这个也是错的,listener不能发送event
;environment=A="1",B="2"       ; 这个是该子进程的环境变量
                                 默认为空。。。非必须设置
;serverurl=AUTO                ; override serverurl computation (childutils)

; The below sample group section shows all possible group values,
; create one or more 'real' group: sections to create "heterogeneous"
; process groups.

;[group:thegroupname]  ;这个东西就是给programs分组,划分到组里面的program。我们就不用一个一个去操作了
                         我们可以对组名进行统一的操作。 注意:program被划分到组里面之后,就相当于原来
                         的配置从supervisor的配置文件里消失了。。。supervisor只会对组进行管理,而不再
                         会对组里面的单个program进行管理了
;programs=progname1,progname2  ; 组成员,用逗号分开
                                 这个是个必须的设置项
;priority=999                  ; 优先级,相对于组和组之间说的
                                 默认999。。非必须选项

; 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]                         ;这个东西挺有用的,当我们要管理的进程很多的时候,写在一个文件里面
                                    就有点大了。我们可以把配置信息写到多个文件中,然后include过来
;files = relative/directory/*.ini
OK,上面提到的非必须设置项,一般来说,都是有默认值的,可以根据自己的需要去设置。。。如果不设置的,supervisor也能用起来

add by zhj: 上边是在ubuntu上的一些使用经验

安装

sudo pip install supervisor

什么景况下我们供给进度管理吗?正是试行一些急需以守护进度格局执行的顺序,譬喻二个后台职务,我最常用的是用来运行和治本基于
Tornado 写的 Web 程序。

 

配置

Supervisor
十一分强劲,提供了很丰盛的法力,但是大家兴许只供给用到中间一小部分。安装达成今后,能够编写配置文件,来满足自身的要求。为了方便,我们把安顿分成两有的:supervisord(supervisor
是二个 C/S 模型的主次,那是 server 端,对应的有 client
端:supervisorctl)和应用程序(即我们要治本的次第)。

率先来看 supervisord 的安顿文件。安装完 supervisor
之后,能够运营echo_supervisord_conf
命令输出暗许的配置项,也能够重定向到一个配备文件里:

echo_supervisord_conf > /etc/supervisord.conf

剔除个中山大学部分注解和“不相干”的某些,我们能够先看那个布署:

[unix_http_server]
file=/tmp/supervisor.sock   ; UNIX socket 文件,supervisorctl 会使用
;chmod=0700                 ; socket 文件的 mode,默认是 0700
;chown=nobody:nogroup       ; socket 文件的 owner,格式: uid:gid

;[inet_http_server]         ; HTTP 服务器,提供 web 管理界面
;port=127.0.0.1:9001        ; Web 管理后台运行的 IP 和端口,如果开放到公网,需要注意安全性
;username=user              ; 登录管理后台的用户名
;password=123               ; 登录管理后台的密码

[supervisord]
logfile=/tmp/supervisord.log ; 日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB        ; 日志文件大小,超出会 rotate,默认 50MB
logfile_backups=10           ; 日志文件保留备份数量默认 10
loglevel=info                ; 日志级别,默认 info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ; pid 文件
nodaemon=false               ; 是否在前台启动,默认是 false,即以 daemon 的方式启动
minfds=1024                  ; 可以打开的文件描述符的最小值,默认 1024
minprocs=200                 ; 可以打开的进程数的最小值,默认 200

; 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:///tmp/supervisor.sock ; 通过 UNIX socket 连接 supervisord,路径与 unix_http_server 部分的 file 一致
;serverurl=http://127.0.0.1:9001 ; 通过 HTTP 的方式连接 supervisord

; 包含其他的配置文件
[include]
files = relative/directory/*.ini    ; 可以是 *.conf 或 *.ini

小编们把地点这一部分公司署保存到
/etc/supervisord.conf(或别的随便有权力访谈的文件),然后启动supervisord(通过 -c
选项指定安插文件路线,假诺不点名会坚守那么些顺序查找配置文件:$CWD/supervisord.conf,
$CWD/etc/supervisord.conf, /etc/supervisord.conf):

supervisord -c /etc/supervisord.conf

翻开 supervisord 是还是不是在运行:

ps aux | grep supervisord

program 配置
地点大家早已把 supervisrod
运维起来了,今后能够增加大家要处理的经过的配置文件。这一个布置能够都写到
supervisord.conf 文件里,假若应用程序比很多,最佳通过 include
的主意把区别的主次(组)写到分歧的布署文件里。

为了比方,我们新建三个目录 /etc/supervisor/
用于存放那个布署文件,相应的,把 /etc/supervisord.conf 里 include
部分的的计划修改一下:

[include]
files = /etc/supervisor/*.conf
假设有个用 Flask 开发的用户系统 usercenter, 生产环境使用 gunicorn 运行。项目代码位于 /home/leon/projects/usercenter,WSGI 对象位于 wsgi.py。在命令行启动的方式是这样的:

cd /home/leon/projects/usercenter
gunicorn -w 8 -b 0.0.0.0:17510 wsgi:app
对应的配置文件可能是:

[program:usercenter]
directory = /home/leon/projects/usercenter ; 程序的启动目录
command = gunicorn -w 8 -b 0.0.0.0:17510 wsgi:app  ; 启动命令
autostart = true     ; 在 supervisord 启动的时候也自动启动
startsecs = 5        ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true   ; 程序异常退出后自动重启
startretries = 3     ; 启动失败自动重试次数,默认是 3
user = leon          ; 用哪个用户启动
redirect_stderr = true  ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB  ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20     ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /data/logs/usercenter_stdout.log

其中 [program:usercenter] 中的 usercenter
是应用程序的独一标志,不可能重新。对该程序的兼具操作(start, restart
等)都通过名字来贯彻。

除了,Supervisor
还能够很谈得来的保管程序在命令行上输出的日记,能够将日志重定向到自定义的日志文件中,还是能够按文件大小对日记进行剪切。

1. 简介

supervisor有多少个零件:supervisord和supervisorctl,组成了client/server结构。

supervisord担任读入配置文件,然后supervisord拘押的应用程序以supervisord子进程的方式运行,supervisord会自动将应用程序的历程转为守护进程,

这么即让你退出shell也没影响。注意,借使三个进度已经是照拂进度了,那用supervisord监控时,会出错。

supervisorctl则承担和supervisord进行交流,获取运维中的进度音讯,富含pid,uptime等音讯。supervisorctl不只能够通过命令行参数实行支配,又能够

威尼斯官网,直白步入二个故意的shell,通过这几个shell管控进度组。这样,不只能够让部分同学纯正把握进度意况,又能制止放手shell权限,一举多得。

 

管理

Supervisord安装到位后有三个可用的命令行supervisor和supervisorctl,命令使用表达如下:

  • supervisord,最早运营Supervisord,运转、处理配置中设置的进程。
  • supervisorctl stop
    programxxx,结束某三个历程(programxxx),programxxx为[program:blogdemon]里布署的值,这些示例正是blogdemon。
  • supervisorctl start programxxx,运行某些进程
  • supervisorctl restart programxxx,重启有些进度
  • supervisorctl stop
    all,甘休一切进度,注:start、restart、stop都不会载入最新的布署文件。
  • supervisorctl
    reload,载入最新的布署文件,并按新的布署运营、管理全数进程。

Supervisor 有五个非常重要的组成都部队分:

2. 装置和安排

官网: 

建议用sudo pip install supervisor来安装,不要用apt-get安装

安装后,用echo_supervisord_conf > ~/supervisord.conf生成配置文件

 

  1. supervisord,运维 Supervisor 时会运营贰个进程supervisord,它承担运转所管理的进度,并将所管理的经过作为本身的子进程来运维,况且能够在所管理的长河现身崩溃时自动重启。
  2. supervisorctl,是命令行管理工科具,能够用来施行 stop、start、restart
    等一声令下,来对那一个子进度展开田管。

3. 起动和关闭

启动supervisor: supervisord -c /etc/supervisor/supervisor.conf   #
假诺不钦命布置文件,那自动加载/etc/supervisord.conf

一般会陈设成开机自运营,所以需求二个init脚本,参见Running supervisord automatically
on
startup,下载对应你的操作系统的运转脚本就足以了,

可是,里面包车型地铁从头到尾的经过恐怕供给修改,比方supervisord和supervisorctl的不二秘籍,pid和log的路子与你supervisord.conf中的pid和log路线要一致

关闭supervisor: sudo kill <supervisord进程id>          #
kill默然会发送SIGTERM时限信号,supervisord收到该实信号会,会关闭全数子进度,最终关闭本身,那一个进度或然要求几分钟

 

安装

4. 布局文件

详细的配置参见

supervisord必要监控的进度无法是守护进度。比方要监督nginx,那你要在nginx配置文件nginx.conf中,设置daemon
off

supervisor的布置项有相当多,下边是合营社dev景况上的celery_beat应用程序的配置项

[program:celery_beat]
command=python manage.py celery beat --loglevel=info --settings=configs.dev
directory=/home/zhj/work/hera/   ; 执行command前,先跳转到directory
autorestart=true          ; 当进程关闭后,重启,当然,对于用supervisorctl stop xx关闭的进程,不会重启
redirect_stderr=true      ; 重定向程序的标准错误到标准输出 (default false)
startsecs=10              ; 启动后坚持运行多长时间被认为是启动成功了, (def. 1)
stopwaitsecs=30           ; 最长结束等待时间,超过这个时间还没收到子进程的SIGCHLD信号,那就用SIGKILL强制结束子进程 (default 10)
stdout_logfile=/var/log/celery/celery_beat.log
stdout_logfile_maxbytes=50MB
autostart=true            ; 当supervisor启动后,也随之启动

sudo pip install supervisor

5. supervisorctl命令

貌似唯有运行supervisor时,用到supervisord命令,其真实情情况下,用supervisorctl就足以了。

用上面包车型客车一声令下步向supervisor shell,
sudo最佳增进,不然有希望报错

试行supervisorctl时,配置文件的追寻路线如下

 

  1. $CWD/supervisord.conf
  2. $CWD/etc/supervisord.conf
  3. /etc/supervisord.conf

 

zhj@pc:~$ supervisorctl -c /etc/supervisor/supervisord.conf 
celery_beat                      STOPPED   Not started
celeryworker_celery:0            STOPPED   Not started
celeryworker_celery:1            STOPPED   Not started
celeryworker_email               STOPPED   Not started
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

supervisor> help start
start <name>        Start a process
start <gname>:*        Start all processes in a group
start <name> <name>    Start multiple processes or groups
start all        Start all processes
supervisor> 

上边是supervisorctl命令行下的一声令下:

status  #翻开supervisord监察和控制的具有进度的地方

celery status  #查阅celery进度的气象

stop xxx   #悬停某一个历程(xxx),xxx为[program:theprogramname]里安顿的值

start xxx  #启航有个别进程

restart xxx  #重启有些进度

stop groupworker  #重启所

stop
all  #悬停全数进程,注:start、有属于名称叫groupworker那么些分组的进度(start,restart同理)restart、stop都不会载入最新的配备文件

reload
  #重启supervisor

update  #基于新型的布署文件,运转新安顿或有改变的进度,配置未有变动的经过不会受影响而重启。 当配置文件修改后,要实践那条命令。

                               #显示用stop截止掉的经过,固然配置文件设置了autorestart=true,用reload可能update都不会活动重启。

用supervisor监察和控制celery和celery
beat,配置参数见celery官方文书档案提供的链接,

 

创制布局文件

6. supervisor的log

  在[program:xxx]中,假诺设置了numprocs > 1,
那每一个进程会动用单独的一个log文件,大家来解析上边包车型客车配置。

stdout和stderr文件都是/var/log/celery/celeryworker_celery.log

supervisor会运转八个celeryworker_celery进度(名称分别是celeryworker_celery:0和celeryworker_celery:1),并在运维时创设celeryworker_celery.log

还有celeryworker_celery.log.1 ~
celeryworker_celery.log.5那5个轮转log文件。那七个进度会分别写不一样的log文件,不会写到同三个文本,

这是supervisor保证的。celeryworker_celery.log只会被内部四个经过使用,另三个历程会接纳celeryworker_celery.log.xx。当celeryworker_celery.log

达到stdout_logfile_maxbytes时,它会被关闭,一碗水端平命名字为celeryworker_celery.log.1,如若开采celeryworker_celery.log.1已经存在,这就把这

个已存在的celeryworker_celery.log.1重命名字为celeryworker_celery.log.2,依次类推。你能够想像有多少个水缸并排,在首先个水缸的顶上部分有多个注水

口,满了之后,将水缸向右推二个职位,即推到第二个水缸的职位,然后在率先个水缸的地点扩展多少个新水缸,而最右侧的格外水缸被挤出游列。二个注水

口就一定于三个历程,当numprocs>1,即八个进度时,正是在numprocs个水缸上面各有四个进蓝鳕。在

is not possible for two processes

to share a single log file (stdout_logfile) when rotation
(stdout_logfile_maxbytes) is enabled. This will result in the file
being corrupted. 

即当设置了log rotate时,supervisor能够确定保障每一个进程使用差别的log文件

[program:celeryworker_celery]
command=python manage.py celery worker -l info -Q celery -c 1 --settings=configs.local_default
directory=/home/workspace/gikoo/
redirect_stderr=true                     ; 将stderr重定向到stdout
startsecs=10
stopwaitsecs=30
stdout_logfile=/var/log/celery/celeryworker_celery.log
stdout_logfile_maxbytes=3KB
autostart=false
autorestart=false
numprocs=2
process_name=%(process_num)d
stdout_logfile_backups=5

echo_supervisord_conf > /etc/supervisord.conf

7. 遇见的片段难题

不知是哪些来头,用supervisor监察和控制celery
worker时,一时会现出尸鬼进度,各种celery worker都以叁个进度池,

种种进程池有三个main process和一组worker
process,每种main process都以supervisor的子进度。但利用中

发觉,一时会并发有的celery进度的父进度是1号经过,当前卫无检查那些经过是main
process照旧worker process,

质疑是worker
process的恐怕性比十分大,原因有希望是supervisor关闭celery时,main
process在向来不等待worker 

process关闭的情形下就关闭了,那样worker
process就没了父进度,1号经过就成了她们的父进度。由于职责的猎取

都以main
process与broker之间实行的,那样的话,这几个1号经过下的worker
process由于无法与broker通讯,所以

也就不会再实践职务了(这块东西待讨论)。

 

原文:

常常会遇见要写一些医生和护师进度,轻松做法归入后台:

shell> nohup python xxx.py & 

一时那样做仍是能够承受,若是一批这样的吧?

理所必然还会有一个难题,就是各类劳动,对应的命令恐怕路线都不太同样,例如Apache、MySQL可能其余活动编写翻译的工具。

若果得以统一保管这个使用,是或不是很哈皮?

根据规矩现Google一把,不失所望找到贰个奇妙的利器。supervisor!

supervisor地址:http://supervisord.org,官方标语正是:二个经过管理工科具。

安装:

sudo pip install supervisor

安装好未来,有多少个可试行文件和一个布置文件(平台差别,只怕路线不等同):

/usr/bin/supervisord             --  supervisor服务守护进程 

/usr/bin/supervisorctl           --  supervisor服务控制程序,比如:status/start/stop/restart/update等

/etc/supervisor/supervisord.conf  --  配置文件,定义服务名称以及接口等等 

上面来多少个演示,用web.py写三个hello的次序:

import web
urls = (     '/(.*)','hello' ) 
app = web.application(urls, globals())
class hello:     
    def GET(self, name):         
        return 'hello: ' + name 

if __name__ == '__main__':     
    app.run() 

本条时候能够直接开发银行这一个程序了,下边来布局supervisor,参与管理。修改supervisord.conf,插足如下一些:

[program:hello]
command=python /home/smallfish/hello.py
autorstart=true
stdout_logfile=/home/smallfish/hello.log

上边包车型客车情致应该很轻便懂,program前面跟服务的名目,command是前后相继的实行路线,autorstart是意味着应用程序随supervisor的开发银行而运维,stdout_logfile是捕获规范输出。

到此地,基本解决了,上面正是运转管制:

shell> sudo /etc/init.d/supervisor start   -- 启动supervisor服务 
shell> sudo supervisorctl status hello     -- 获取hello服务的状态,因为是autorstart,这里已经启动了 
hello  RUNNING    pid 1159, uptime :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 

OK,基本的操作正是近乎这一个了,留神看supervisord.conf文件里会开采有一段[unix_http_server]的配备,暗中同意是9001端口,能够输入客户名和密码,主要用以Basic
Auth认证用的。

填写一下,然后重启supervisor服务,张开浏览器输入:

威尼斯官网 2

sudo supervisorctl shutdown  #
关闭supervisord,会同一时候关闭supervisord监察和控制的具备进度

 

假若现身未有权限的主题材料,能够应用那条命令

sudo su – root -c “echo_supervisord_conf > /etc/supervisord.conf”

布署文件注脚

想要掌握怎么布局必要管住的进程,只要张开 supervisord.conf
就能够了,里面有很详细的注释消息。

开采配置文件

vim /etc/supervisord.conf

暗中认可的布署文件是下边那样的,不过此地有个坑需求留心,supervisord.pid 以及
supervisor.sock 是位于 /tmp 目录下,不过 /tmp
目录是存放有时文件,里面包车型地铁公文是会被 Linux
系统除去的,一旦那几个文件错失,就不可能再通过 supervisorctl 来实施 restart
和 stop 命令了,将只会收获 unix:///tmp/supervisor.sock 不真实的荒唐 。

[unix_http_server]
;file=/tmp/supervisor.sock  ; (the path to the socket file)
;修改为 /var/run 目录,避免被系统删除
file=/var/run/supervisor.sock  ; (the path to the socket file)
;chmod=0700         ; socket file mode (default 0700)
;chown=nobody:nogroup    ; socket file uid:gid owner
;username=user       ; (default is no username (open server))
;password=123        ; (default is no password (open server))

;[inet_http_server]     ; inet (TCP) server disabled by default
;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]
;logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
;修改为 /var/log 目录,避免被系统删除
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB    ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10      ; (num of main logfile rotation backups;default 10)
loglevel=info        ; (log level;default info; others: debug,warn,trace)
;pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
;修改为 /var/run 目录,避免被系统删除
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
...
;设置启动supervisord的用户,一般情况下不要轻易用root用户来启动,除非你真的确定要这么做
;user=chrism         ; (default is current user, required if root)
...

[supervisorctl]
; 必须和'unix_http_server'里面的设定匹配
;serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
;修改为 /var/run 目录,避免被系统删除
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris       ; should be same as http_username if set
;password=123        ; should be same as http_password if set
...

私下认可意况下,进度的日志文件到达50MB时,将进行分割,最多保留11个文本,当然这一个计划也足以对各样进度单独安排。

权限难点

安装好布局文件后,应先创立上述配置文件中新扩大的公文夹。要是内定了开发银行顾客user,这里以 oxygen
为例,那么应当心相关文书的权柄难题,包罗日志文件,不然会冒出未有权力的荒唐。比如设置了运行用户oxygen,然后运转 supervisord 出现错误

Error: Cannot open an HTTP server:
socket.error reported errno.EACCES (13)

纵使出于地点的配备文件中 /var/run 文件夹,未有授予运营 supervisord
的客户 oxygen 的写权限。/var/run 文件夹实际上是链接到 /run,因此我们修改
/run 的权柄。

sudo chmod 777 /run

那样某个轻便阴毒,也得以思念把上述配置文件中 .sock,.pid
等文件修改到别的文件夹中,并保管有相应的权限就能够。一般情况下,我们得以用
root 客商运营 supervisord
进程,然后在其所管理的经过中,再具体钦命必要以极度顾客运营那些经过。

行使浏览器来治本

supervisor
同不时候提供了通过浏览器来治本过程的章程,只供给注释掉如下几行就能够了。

;[inet_http_server]     ; inet (TCP) server disabled by default
;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))

[supervisorctl]
...
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris       ; should be same as http_username if set
;password=123        ; should be same as http_password if set

 威尼斯官网 3

使用 include

在计划文件的最后,有三个 [include] 的配备项,跟 Nginx 同样,可以include
某些文件夹下的具备配置文件,那样我们就可以为种种进程或有关的多少个经过的安顿单独写成一个文本。

[include]
files = /etc/supervisord.d/*.ini

经过的安插样例

三个大致的例子如下

; 设置进程的名称,使用 supervisorctl 来管理进程时需要使用该进程名
[program:your_program_name] 
command=python server.py --port=9000
;numprocs=1         ; 默认为1
;process_name=%(program_name)s  ; 默认为 %(program_name)s,即 [program:x] 中的 x
directory=/home/python/tornado_server ; 执行 command 之前,先切换到工作目录
user=oxygen         ; 使用 oxygen 用户来启动该进程
; 程序崩溃时自动重启,重启次数是有限制的,默认为3次
autorestart=true      
redirect_stderr=true    ; 重定向输出的日志
stdout_logfile = /var/log/supervisord/tornado_server.log
loglevel=info

设置日志等第

loglevel 钦点了日志的等第,用 Python 的 print
语句输出的日记是不会被记录到日志文件中的,须求搭配 Python 的 logging
模块来输出有钦定品级的日记。

七个进度

安分守纪法定文书档案的定义,二个 [program:x]
实际上是代表一组一致特征或同类的历程组,也便是说二个 [program:x]
能够运行八个经过。那组经过的分子是透过 numprocs 和 process_name
那四个参数来分明的,那句话怎么意思啊,大家来看那几个例子。

; 设置进程的名称,使用 supervisorctl 来管理进程时需要使用该进程名
[program:foo] 
; 可以在 command 这里用 python 表达式传递不同的参数给每个进程
command=python server.py --port=90%(process_num)02d
directory=/home/python/tornado_server ; 执行 command 之前,先切换到工作目录
; 若 numprocs 不为1,process_name 的表达式中一定要包含 process_num 来区分不同的进程
numprocs=2          
process_name=%(program_name)s_%(process_num)02d; 
user=oxygen         ; 使用 oxygen 用户来启动该进程
autorestart=true      ; 程序崩溃时自动重启
redirect_stderr=true    ; 重定向输出的日志
stdout_logfile = /var/log/supervisord/tornado_server.log
loglevel=info

上边那个事例会运维三个经过,process_name 分别为 foo:foo_01 和
foo:foo_02。通过如此一种办法,就能够用贰个 [program:x]
配置项,来运行一组特别临近的历程。

再介绍多个布局项 stopasgroup 和 killasgroup

; 默感觉 false,即使设置为 true,当进度收到 stop
频域信号时,会活动将该时限信号发给该进程的子进度。倘使那几个布局项为
true,那么也含有 killasgroup 为 true。比如在 Debug 格局应用 Flask
时,Flask 不会将抽出到的 stop
功率信号也传递给它的子进度,因而就要求安装这么些布局项。

stopasgroup=false       ; send stop signal to the UNIX process 

; 默认为 false,如果设置为 true,当进程收到 kill 信号时,会自动将该信号发给该进程的子进程。如果这个程序使用了 python 的 multiprocessing 时,就能自动停止它的子线程。
killasgroup=false       ; SIGKILL the UNIX process group (def false)

更详细的安顿例子,可以参照如下,官方文书档案在那边

;[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)
;autorestart=unexpected    ; whether/when to restart (default: unexpected)
;startsecs=1          ; number of secs prog must stay running (def. 1)
;startretries=3        ; max # of serial start failures (default 3)
;exitcodes=0,2         ; 'expected' exit codes for process (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)

将多个经过按组管理

Supervisor 同一时间还提供了别的一种过程组的田间管理办法,通过这种艺术,能够动用
supervisorctl 命令来保管一组经过。跟 [program:x]
的经过组差别的是,这里的历程是三个个的 [program:x] 。

[group:thegroupname]
programs=progname1,progname2 ; each refers to 'x' in [program:x] definitions
priority=999         ; the relative start priority (default 999)

当增加了上述配置后,progname1 和 progname2 的经过名就能够成为
thegroupname:progname1 和 thegroupname:progname2
未来将在用那么些名字来管理进度了,实际不是事先的 progname1。

随后实施 supervisorctl stop thegroupname: 就可以而且终止 progname1 和
progname2,施行 supervisorctl stop thegroupname:progname1 就会终止
progname1。supervisorctl 的指令大家稍后介绍。

启动 supervisord

施行 supervisord 命令,将会运转 supervisord
进度,同期我们在安插文件中装置的进度也会相应运维。

# 使用默认的配置文件 /etc/supervisord.conf
supervisord
# 明确指定配置文件
supervisord -c /etc/supervisord.conf
# 使用 user 用户启动 supervisord
supervisord -u user

愈来愈多参数请参见文档

supervisorctl 命令介绍

# 停止某一个进程,program_name 为 [program:x] 里的 x
supervisorctl stop program_name
# 启动某个进程
supervisorctl start program_name
# 重启某个进程
supervisorctl restart program_name
# 结束所有属于名为 groupworker 这个分组的进程 (start,restart 同理)
supervisorctl stop groupworker:
# 结束 groupworker:name1 这个进程 (start,restart 同理)
supervisorctl stop groupworker:name1
# 停止全部进程,注:start、restart、stop 都不会载入最新的配置文件
supervisorctl stop all
# 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程
supervisorctl reload
# 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
supervisorctl update

留心:显示用 stop 结束掉的长河,用 reload 可能 update
都不会活动重启。也得以参照这里

开机自动运行 Supervisord

Supervisord
暗中同意情形下并从未被设置成服务,它本人也是四个经过。官方已经提交了剧本能够将
Supervisord
安装成服务,能够参照这里查看各样操作系统的设置脚本,可是作者用合法这里给的
Ubuntu 脚本却没有任何进展运营。

安装模式能够参谋
serverfault上的答问。

比方说自个儿是 Ubuntu 系统,能够如此安装,这里选取了另外多个剧本

# 下载脚本
sudo su - root -c "sudo curl https://gist.githubusercontent.com/howthebodyworks/176149/raw/d60b505a585dda836fadecca8f6b03884153196b/supervisord.sh > /etc/init.d/supervisord"
# 设置该脚本为可以执行
sudo chmod +x /etc/init.d/supervisord
# 设置为开机自动运行
sudo update-rc.d supervisord defaults
# 试一下,是否工作正常
service supervisord stop
service supervisord start

专心:这一个剧本下载下来后,还需检查一下与大家的陈设是不是相契合,例如暗许的安排文件路线,pid
文件路径等,假如存在分歧则必要开展局地改造。

实质上还应该有三个简约的主意,因为 Linux 在开发银行的时候会施行 /etc/rc.local
里面包车型地铁本子,所以只要在此间丰硕实施命令就可以

# 如果是 Ubuntu 添加以下内容
/usr/local/bin/supervisord -c /etc/supervisord.conf

# 如果是 Centos 添加以下内容
/usr/bin/supervisord -c /etc/supervisord.conf

上述内容须求增多在 exit 命令前,何况由于在实行 rc.local 脚本时,PATH
情况变量未全体开头化,由此命令要求利用相对路线。

在增多前,先在终极测量试验一下限令是还是不是能平日试行,假使找不到
supervisord,能够用如下命令找到

sudo find / -name supervisord

您只怕感兴趣的篇章:

  • nodejs
    图解express+supervisor+ejs的用法(推荐)
  • python进度管理工科具supervisor的安装与使用教程
  • 利用Supervisor管理Redis进度的点子教程
  • centos7运用supervisor的详尽教程
  • PHP框架Laravel中落到实处supervisor推行异步进度的艺术
  • PHP技士玩转Linux种类使用supervisor完毕守护进度
  • Python使用Supervisor来处理进程的点子
  • Mac下Supervisor进度监察和控制管理工科具的装置与安排
  • node.js开采中接纳Node
    Supervisor达成监测文件修改并自动重启应用
  • python进度管理工科具supervisor使用实例
  • 使用Python的Supervisor举办进程监控以及自动运营
  • 详解supervisor使用教程

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图