|
Supervisor安装与配置(linux/unix进程管理工具) Supervisor(http://supervisord.org)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。6 G9 U0 U' k: J/ _+ @
因为Supervisor是Python开发的,安装前先检查一下系统否安装了Python2.4以上版本。下面以CentOS7.6,Python2.7.5版本环境下,介绍Supervisor的安装与配置步聚: 实验环境系统平台 - * r7 q' v/ e* y
- cat /etc/redhat-release
, ^8 d( G. X, E - CentOS Linux release 7.6.1810 (Core)
复制代码
; l$ |! d b) _8 GPython版本 - ! S8 U) v8 c9 m. h$ C+ O0 a- M1 a
- python -V& j$ e4 x! p2 _# a4 T. [8 k
- Python 2.7.5
复制代码- 如果python版本低于2.6请升级,下面贴出一个安装python3.6.8的安装示例
复制代码
5 K9 l+ w- k, C6 v# T4 t) s9 H* T- yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y libffi-devel
. c3 o$ F& L" s" {1 O3 `/ M - wget http://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz
# I9 }2 U# t B5 ` - tar xf Python-3.6.8.tar.xz | U, a# Z7 k; [0 Y
- cd Python-3.6.8
4 s8 X/ W4 P4 {$ C1 |0 V$ j9 h - ./configure --prefix=/usr/local/python3684 i) G& l8 |: C$ L+ Y* {: n
- make && make install
. b5 _+ ^3 `) E/ ?1 f( O1 |1 L - echo 'export PATH=/usr/local/python368/bin:$PATH' >> /etc/profile
: G3 n, y: ?( f$ A2 G3 |, Z: }9 B( f - source /etc/profile/ ~0 h9 S8 s g' _ [& I$ f
- python3 -V
复制代码
% \& L( e1 q# u6 ^ A. x; V# W7 | 安装 Supervisor安装 Supervisor的方法很多,以下介绍三种,我这里所采用的为第三种 1、easy_install 安装 supervisor 安装Python包管理工具(easy_install) easy_install是setuptools包里带的一个命令,使用easy_install实际上是在调用setuptools来完成安装模块的工作,所以安装setuptools即可:
9 i! |7 f" T( t/ h- wget http://pypi.io/packages/source/s/setuptools/setuptools-33.1.1.zip
" f |7 x* w4 M5 x2 P - unzip setuptools-33.1.1.zip
1 E8 A D9 j; c$ J - cd setuptools-33.1.19 A/ @- s0 L; X6 D& ]6 a) g# g
- python setup.py install& H/ T; s6 A" D5 x& ^
- 7 T+ ~/ r( \( R; @
- easy_install supervisor
复制代码
% J* l1 K$ c8 j1 o& E2、pip 安装 supervisor 使用 pip 来安装,前提要保证pip版本大于2.6 - 9 d$ J% z" ] J; g5 \" [2 k$ c
- pip install supervisor
复制代码
( v& n! \! i5 H5 M3、yum epel-release 安装 supervisor - : b2 W1 O3 T/ v3 ^: S/ b
- yum install -y epel-release && yum install -y supervisor
复制代码
; _* L8 {" ^9 {, F1 F ^+ t" {; v superviso命令supervisor安装完成后会生成三个执行程序:supervisortd、supervisorctl、echo_supervisord_conf: •supervisortd:用于管理supervisor本身服务•supervisorctl:用于管理我们需要委托给superviso工具的服务•echo_supervisord_conf:用于生成superviso的配置文件•supervisor的守护进程服务(用于接收进程管理命令)•客户端(用于和守护进程通信,发送管理进程的指令)
4 p/ `( I5 q. c) }# b' p- [root@Jumpserver /]# which supervisord
/ s7 C- A8 n2 D* Q- k - /bin/supervisord
\" z4 W% b1 h# s; [/ O, @- y - [root@Jumpserver /]# which supervisorctl; s* \8 [% O- W1 \1 D* S& m* Q
- /bin/supervisorctl
$ Y- f: V( ?- ?1 k% K6 b - [root@Jumpserver /]# which echo_supervisord_conf
: K0 U6 e1 B( i+ _& G3 T - /bin/echo_supervisord_conf
复制代码
" {; W/ I+ f* ] 配置Supervisor通过运行echo_supervisord_conf程序生成supervisor的初始化配置文件 如果使用yum安装则此步骤省略,直接进行修改配置文件步骤
" P3 X! s \0 b+ c- mkdir /etc/supervisord.d/ V9 Q+ K7 I3 G5 T1 C" r, l) @
- echo_supervisord_conf > /etc/supervisord.conf
复制代码 4 N! \- j, ^ Y% L8 ~) O
修改配置文件 supervisor的配置文件内容有很多,不过好多都不需要修改就行使用,我这里只修改了以下两项 - + j& [8 _; n& v `3 A
- #修改socket文件的mode,默认是0700: c7 @* o9 B9 j0 [6 Q
- sed -i 's/;chmod=0700/chmod=0766/g' /etc/supervisord.conf / a- C, ?7 D! V& y! v J* U: V
- 9 K$ r, L `5 U
- #在配置文件最后添加以下两行内容来包含/etc/supervisord目录7 b& |* `- e; c
- sed -i '$a [include] \
M9 \ q3 P: V# c( U* M( H - files = /etc/supervisord.d/*.conf' /etc/supervisord.conf
复制代码 - L8 I2 c' X+ l9 i- h0 d
编写需要被Supervisor管理的进程Supervisor只能管理非dameon进程,像默认的redis为前台运行、Tomcat其实是 startup.sh shutdown.sh来调用catalina.sh进行后台运行的,默认catalina.sh为前台运行的程序,不能管理像Nginx一样的非dameon进程 Tomcat被Supervisor管理Tomcat安装如下:
) O; n0 ]% s" G( p4 i3 X0 i/ s- wget http://us.mirrors.quenda.co/apache/tomcat/tomcat-8/v8.5.47/bin/apache-tomcat-8.5.47.tar.gz- ?: W1 n/ ?; O* u
- yum install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64 -y$ x3 b9 A( Z9 s1 N; L- a3 Y
- tar xf apache-tomcat-8.5.47.tar.gz -C /usr/local/
+ O3 ~: n2 [5 j* I7 B- W - mv /usr/local/apache-tomcat-8.5.47 /usr/local/tomcat
复制代码
7 E! u+ r l, Q# B3 [2 A想要我们的应用被Supervisor管理,就需要在/etc/supervisord目录下编写配置文件,Tomcat案例如下: - / a% {' X. x) m; F/ d8 E
- vim /etc/supervisord.d/tomcat.conf; Z& A9 r' ` U( Z1 j- b D7 R3 ~
- [program:tomcat] #程序唯一名称0 k: y0 v; a4 s; [- b. \: @' i2 t
- directory=/usr/local/tomcat #程序路径' d5 g7 k8 k3 ^2 U8 L$ g
- command=/usr/local/tomcat/bin/catalina.sh run #运行程序的命令
9 F4 j G9 z) `# U, | - autostart=true #是否在supervisord启动后tomcat也启动
: @- g, T, Z6 m, g" |+ i b. k) y - startsecs=10 #启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
) b" \4 G% h3 b! o - autorestart=true #程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启;意思为如果不是supervisord来关闭的该进程则认为不正当关闭,supervisord会再次把该进程给启动起来,只能使用该supervisorctl来进行关闭、启动、重启操作 6 d* ^! E' z9 ]& { B4 e) V, I
- startretries=3 #启动失败自动重试次数,默认是35 a' l4 R T+ I- [( {" u; l9 S
- user=root #用哪个用户启动进程,默认是root2 r" d! x2 X9 g5 X8 N4 h
- priority=999 #进程启动优先级,默认999,假如Supervisord需要管理多个进程,那么值小的优先启动
/ ]# d+ {) |. u - stopsignal=INT- v4 Z5 _. h9 ]9 ^& P' z5 ~& @
- redirect_stderr=true #把stderr重定向到stdout标准输出,默认false! X: h$ ?/ b0 O$ R* n! H/ m; n/ T
- stdout_logfile_maxbytes=200MB #stdout标准输出日志文件大小,日志文件大小到200M后则进行切割,切割后的日志文件会标示为catalina.out1,catalina.out2,catalina.out3...,默认50MB5 X, s% V8 r/ \* T
- stdout_logfile_backups = 100 #stdout标准输出日志文件备份数,保存100个200MB的日志文件,超过100个后老的将被删除,默认为10保存10个
; S0 e& [% ^, U. J1 I$ o2 p, a2 { - stdout_logfile=/usr/local/tomcat/logs/catalina.out #标准日志输出位置,如果输出位置不存在则会启动失败! V0 i% Y$ E$ p
- stopasgroup=false #默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
0 |: m: Z6 q/ `% e- M: B# @- L% _ - killasgroup=false #默认为false,向进程组发送kill信号,包括子进程
复制代码
9 s" X; p! _3 v$ A9 B启动进程 使用supervisord管理启动后,当你使用/usr/local/tomcat/shutdown.sh或者kill $PID的时候,supervisord都会认为是意外关闭,会自动再次把进程拉起,除非是使用supervisord命令关闭 - % n9 g) [ {! e& p6 Y7 Z
- #supervisord启动% W$ O( k* J3 M6 H) p* ^
- supervisord -c /etc/supervisord.conf #启动supervisord进程,我们在配置文件中设置了 autostart=true 参数,在supervisord启动的时候 tomcat也随之启动
0 G( @7 c2 y& n - ps -ef|grep java #查看tomcat是否启动
复制代码
3 C4 t1 C6 k" z1 E( G+ O' B9 A' J程序管理
" I; ?3 L( R f( @ M. X ~- supervisorctl status tomcat #tomcat状态
2 u# g/ v0 R2 V' p) z, U6 [ - supervisorctl stop tomcat #停止tomcat
0 s$ A: p) Y# H/ O - supervisorctl start tomcat #启动tomcat
4 s: m1 y' ~4 S; m% z - supervisorctl restart tomcat #重启tomcat
. U8 w- F1 x! g3 F6 z - supervisorctl reoload tomcat #重仔tomcat
复制代码 1 E3 d F( i) A
Redis被Supervisor管理redis默认不在配置文件中添加 daemonize yes 参数则是前台启动的,所以也可以被我们的的Supervisor所管理 redis配置文件如下: - 7 E7 R; I1 ^1 W: \+ v* D6 E! m3 W
- cat redis6001.conf A! [; D' a& t* h) ?4 U3 ~
- port 6001
$ {6 p1 Y% S) e - bind 192.168.31.230) [" Q8 q Y: G# i6 W# J" G
- protected-mode yes, H5 M) r9 ] W
- pidfile "/usr/local/redis/run/redis6001.pid"% h& {- [. F% r1 h
- loglevel notice
- w2 |6 [3 Y+ J4 B6 Y2 K5 a7 U. h7 | - logfile "/usr/local/redis/logs/redis6001.log"
/ _4 U/ {. W+ _, @/ h) w - save 900 14 Y( T" g& d& `* @
- stop-writes-on-bgsave-error yes
. ]/ K" \3 |* Y! i; ~ - rdbcompression yes2 V# J9 O& ~0 d0 @/ b. J
- rdbchecksum yes
9 \' [6 L) X* B7 d - dbfilename dump.rdb
9 l1 W0 Y: r0 C4 N# r# G4 j - dir "/usr/local/redis/data/rdb/"
' l R2 y3 B9 W" ]& z - timeout 0" h$ g) F. ?7 E3 F* d1 H
- tcp-keepalive 300
复制代码 - K% b$ U' a ~) h U. L
编写redis被Supervisor管理的案例 - , V9 @1 H/ X e! p" ^% y
- vim /etc/supervisord.d/redis.conf% ~" N5 \9 \+ C- _" S r' B3 r7 L
- [program:redis]+ _. N. g4 Z8 `0 i' H! q1 ^) w, r
- directory=/usr/local/redis
, Y* ~4 v: K: T+ K: J { - command=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis6001.conf
y& ^# _5 o0 r. j - autostart=true
6 v6 x! M2 ~$ [2 m% o; K( C) d - startsecs=10. t0 |+ U+ N. ?; C: f4 D, y
- autorestart=true( t2 e/ j9 g$ G- v
- startretries=3/ Q9 Z3 \8 |6 H. _2 j/ h
- user=root
6 q. b( ?+ O" ]! u1 k - priority=999
/ t. u; k: `3 @+ O# S - stopsignal=INT
/ \: C$ @5 b. z4 k - redirect_stderr=true+ v! B' D f7 |& m5 W
- stdout_logfile_maxbytes=200MB2 T- f* \( |. Q" J1 [5 M$ @
- stdout_logfile_backups = 100
7 z7 k; t/ J2 H7 f# f - stdout_logfile=/usr/local/redis/logs/redis6001.log
% u# ~0 ^' P: }: g0 u - stopasgroup=false
; T$ U. O! T( F. p6 d - killasgroup=false
复制代码 $ `0 ?- H" M5 t+ N
使用super启动redis
5 ?3 u2 ^: N" n @1 N$ v% I- #关闭tomcat
0 k Z, R' z# j7 K - supervisorctl stop tomcat
' f; N7 w L5 w' f - tomcat: stopped: m5 ?2 Y' m& Y& I; S. G! N
$ J# ?; n3 M! c! t' f0 T$ j. b* a" f- #杀掉supervisord
* _4 C. w2 N1 h1 M - ps -ef|grep supervisord9 Z. _& q' r: C, [, y5 e
- root 26927 1 0 10:47 ? 00:00:00 /usr/bin/python /bin/supervisord -c /etc/supervisord.conf9 T7 J' `! L- t0 y1 k$ ^
- root 27549 27402 0 11:07 pts/2 00:00:00 grep --color=auto super/ r' B, G* t# ]3 ]
- kill -9 26927
! M& O5 N/ \; x! M6 ?" E - 6 g) E1 T; B- E
- #重新启动supervisord使其重新加载配置文件,supervisord默认会把redis和tomcat都拉起来
2 `+ \3 J" [' `. g" t, B3 _& J - supervisord -c /etc/supervisord.conf
复制代码 + k) Z) ~" L- R. R
程序管理
+ D! j( h6 P" `: E% }- supervisorctl status redis #redis状态+ T6 w( r& L Q* {1 ~3 p2 L; z3 P
- supervisorctl stop redis #停止redis
7 e# b6 r+ p0 i B - supervisorctl start redis #启动redis
# M' H4 [/ S* [0 V1 C1 f( D - supervisorctl restart reids #重启redis
9 S4 Y8 v: x+ U3 A* Z8 u - supervisorctl reoload redis #重载redis
复制代码
/ g' b3 h# R6 X& M 程序管理程序管理
/ V+ C/ a' Q# k- supervisorctl status all #查看所有进程状态( T( P( a6 T6 h5 t+ Z2 m
- supervisorctl stop all #停止所有进程
% t. Y" o, a9 }0 C - supervisorctl start all #启动所有进程& X+ h0 M" d# m+ c0 w, V# s4 z' Q3 L
- supervisorctl restart all #重启所有进程) \6 R0 _+ @& Q0 m; k# _
- supervisorctl reoload all #重载所有进程
复制代码 5 }' z' W- S2 I) D! i
Supervisord开启启动配置
9 j" A4 B, X; d7 ~* G
# y$ B( B8 D3 ^; X0 e- vim /usr/lib/systemd/system/supervisord.service
/ k" n1 z5 K0 V/ L5 u - [Unit]
2 n; T+ o. \6 N - Description=Process Monitoring and Control Daemon
' F: y3 N9 f- c' r4 N7 ] - After=rc-local.service nss-user-lookup.target
/ @4 j- o9 i" e9 \" n# V - 5 f; w8 F6 Y9 a# `
- [Service]0 O4 |# p( R/ ~! i; v
- Type=forking
4 f1 J# C# z$ N9 S1 l - ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf6 N- ?! v" }, y0 [# Z
- 2 ~5 w8 f! m5 U( e: _6 k
- [Install]8 y( A2 g, U3 X3 R. g" b
- WantedBy=multi-user.target
复制代码- # K, m8 i. s/ B2 V( N! ]3 }
- systemctl enable supervisord
& G8 ^6 U4 m" O2 Q) F! T. }& x - systemctl is-enabled supervisord
复制代码
% F$ y1 w4 E0 S. ?, ^% u4 [( S! t3 U. p5 m
: R1 Q" f' o% S# ^: m9 ?! I9 R& C |