你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Linux进程管理工具—— Supervisor

[复制链接]
gaosmile 发布时间:2020-6-9 11:48
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的安装与配置步聚:
实验环境
系统平台
  1. * r7 q' v/ e* y
  2. cat /etc/redhat-release
    , ^8 d( G. X, E
  3. CentOS Linux release 7.6.1810 (Core)
复制代码

; l$ |! d  b) _8 G
Python版本
  1. ! S8 U) v8 c9 m. h$ C+ O0 a- M1 a
  2. python -V& j$ e4 x! p2 _# a4 T. [8 k
  3. Python 2.7.5
复制代码
  1. 如果python版本低于2.6请升级,下面贴出一个安装python3.6.8的安装示例
复制代码

  1. 5 K9 l+ w- k, C6 v# T4 t) s9 H* T
  2. 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
  3. wget http://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz
    # I9 }2 U# t  B5 `
  4. tar xf Python-3.6.8.tar.xz  |  U, a# Z7 k; [0 Y
  5. cd Python-3.6.8
    4 s8 X/ W4 P4 {$ C1 |0 V$ j9 h
  6. ./configure --prefix=/usr/local/python3684 i) G& l8 |: C$ L+ Y* {: n
  7. make && make install
    . b5 _+ ^3 `) E/ ?1 f( O1 |1 L
  8. echo 'export PATH=/usr/local/python368/bin:$PATH' >> /etc/profile
    : G3 n, y: ?( f$ A2 G3 |, Z: }9 B( f
  9. source /etc/profile/ ~0 h9 S8 s  g' _  [& I$ f
  10. 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即可:

  1. 9 i! |7 f" T( t/ h
  2. wget http://pypi.io/packages/source/s/setuptools/setuptools-33.1.1.zip
    " f  |7 x* w4 M5 x2 P
  3. unzip setuptools-33.1.1.zip
    1 E8 A  D9 j; c$ J
  4. cd setuptools-33.1.19 A/ @- s0 L; X6 D& ]6 a) g# g
  5. python setup.py install& H/ T; s6 A" D5 x& ^
  6. 7 T+ ~/ r( \( R; @
  7. easy_install supervisor
复制代码

% J* l1 K$ c8 j1 o& E
2、pip 安装 supervisor
使用 pip 来安装,前提要保证pip版本大于2.6
  1. 9 d$ J% z" ]  J; g5 \" [2 k$ c
  2. pip install supervisor
复制代码

( v& n! \! i5 H5 M
3、yum epel-release 安装 supervisor
  1. : b2 W1 O3 T/ v3 ^: S/ b
  2. 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的守护进程服务(用于接收进程管理命令)•客户端(用于和守护进程通信,发送管理进程的指令)

  1. 4 p/ `( I5 q. c) }# b' p
  2. [root@Jumpserver /]# which supervisord
    / s7 C- A8 n2 D* Q- k
  3. /bin/supervisord
      \" z4 W% b1 h# s; [/ O, @- y
  4. [root@Jumpserver /]# which supervisorctl; s* \8 [% O- W1 \1 D* S& m* Q
  5. /bin/supervisorctl
    $ Y- f: V( ?- ?1 k% K6 b
  6. [root@Jumpserver /]# which echo_supervisord_conf
    : K0 U6 e1 B( i+ _& G3 T
  7. /bin/echo_supervisord_conf
复制代码

" {; W/ I+ f* ]
配置Supervisor
通过运行echo_supervisord_conf程序生成supervisor的初始化配置文件
如果使用yum安装则此步骤省略,直接进行修改配置文件步骤

  1. " P3 X! s  \0 b+ c
  2. mkdir /etc/supervisord.d/ V9 Q+ K7 I3 G5 T1 C" r, l) @
  3. echo_supervisord_conf > /etc/supervisord.conf
复制代码
4 N! \- j, ^  Y% L8 ~) O
修改配置文件
supervisor的配置文件内容有很多,不过好多都不需要修改就行使用,我这里只修改了以下两项
  1. + j& [8 _; n& v  `3 A
  2. #修改socket文件的mode,默认是0700: c7 @* o9 B9 j0 [6 Q
  3. sed -i 's/;chmod=0700/chmod=0766/g' /etc/supervisord.conf   / a- C, ?7 D! V& y! v  J* U: V
  4. 9 K$ r, L  `5 U
  5. #在配置文件最后添加以下两行内容来包含/etc/supervisord目录7 b& |* `- e; c
  6. sed -i '$a [include] \
      M9 \  q3 P: V# c( U* M( H
  7. 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安装如下:

  1. ) O; n0 ]% s" G( p4 i3 X0 i/ s
  2. 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
  3. 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
  4. tar xf apache-tomcat-8.5.47.tar.gz  -C /usr/local/
    + O3 ~: n2 [5 j* I7 B- W
  5. mv /usr/local/apache-tomcat-8.5.47 /usr/local/tomcat
复制代码

7 E! u+ r  l, Q# B3 [2 A
想要我们的应用被Supervisor管理,就需要在/etc/supervisord目录下编写配置文件,Tomcat案例如下:
  1. / a% {' X. x) m; F/ d8 E
  2. vim /etc/supervisord.d/tomcat.conf; Z& A9 r' `  U( Z1 j- b  D7 R3 ~
  3. [program:tomcat]                                        #程序唯一名称0 k: y0 v; a4 s; [- b. \: @' i2 t
  4. directory=/usr/local/tomcat                             #程序路径' d5 g7 k8 k3 ^2 U8 L$ g
  5. command=/usr/local/tomcat/bin/catalina.sh run           #运行程序的命令
    9 F4 j  G9 z) `# U, |
  6. autostart=true                                          #是否在supervisord启动后tomcat也启动
    : @- g, T, Z6 m, g" |+ i  b. k) y
  7. startsecs=10                                            #启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
    ) b" \4 G% h3 b! o
  8. autorestart=true                                        #程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启;意思为如果不是supervisord来关闭的该进程则认为不正当关闭,supervisord会再次把该进程给启动起来,只能使用该supervisorctl来进行关闭、启动、重启操作 6 d* ^! E' z9 ]& {  B4 e) V, I
  9. startretries=3                                          #启动失败自动重试次数,默认是35 a' l4 R  T+ I- [( {" u; l9 S
  10. user=root                                               #用哪个用户启动进程,默认是root2 r" d! x2 X9 g5 X8 N4 h
  11. priority=999                                            #进程启动优先级,默认999,假如Supervisord需要管理多个进程,那么值小的优先启动
    / ]# d+ {) |. u
  12. stopsignal=INT- v4 Z5 _. h9 ]9 ^& P' z5 ~& @
  13. redirect_stderr=true                                    #把stderr重定向到stdout标准输出,默认false! X: h$ ?/ b0 O$ R* n! H/ m; n/ T
  14. stdout_logfile_maxbytes=200MB                           #stdout标准输出日志文件大小,日志文件大小到200M后则进行切割,切割后的日志文件会标示为catalina.out1,catalina.out2,catalina.out3...,默认50MB5 X, s% V8 r/ \* T
  15. stdout_logfile_backups = 100                            #stdout标准输出日志文件备份数,保存100个200MB的日志文件,超过100个后老的将被删除,默认为10保存10个
    ; S0 e& [% ^, U. J1 I$ o2 p, a2 {
  16. stdout_logfile=/usr/local/tomcat/logs/catalina.out      #标准日志输出位置,如果输出位置不存在则会启动失败! V0 i% Y$ E$ p
  17. stopasgroup=false                                       #默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
    0 |: m: Z6 q/ `% e- M: B# @- L% _
  18. killasgroup=false                                       #默认为false,向进程组发送kill信号,包括子进程
复制代码

9 s" X; p! _3 v$ A9 B
启动进程 使用supervisord管理启动后,当你使用/usr/local/tomcat/shutdown.sh或者kill $PID的时候,supervisord都会认为是意外关闭,会自动再次把进程拉起,除非是使用supervisord命令关闭
  1. % n9 g) [  {! e& p6 Y7 Z
  2. #supervisord启动% W$ O( k* J3 M6 H) p* ^
  3. supervisord -c /etc/supervisord.conf                    #启动supervisord进程,我们在配置文件中设置了 autostart=true 参数,在supervisord启动的时候 tomcat也随之启动
    0 G( @7 c2 y& n
  4. ps -ef|grep java                                        #查看tomcat是否启动 
复制代码

3 C4 t1 C6 k" z1 E( G+ O' B9 A' J
程序管理

  1. " I; ?3 L( R  f( @  M. X  ~
  2. supervisorctl status tomcat                             #tomcat状态
    2 u# g/ v0 R2 V' p) z, U6 [
  3. supervisorctl stop tomcat                               #停止tomcat
    0 s$ A: p) Y# H/ O
  4. supervisorctl start tomcat                              #启动tomcat
    4 s: m1 y' ~4 S; m% z
  5. supervisorctl restart tomcat                            #重启tomcat
    . U8 w- F1 x! g3 F6 z
  6. supervisorctl reoload tomcat                            #重仔tomcat
复制代码
1 E3 d  F( i) A
Redis被Supervisor管理
redis默认不在配置文件中添加 daemonize yes 参数则是前台启动的,所以也可以被我们的的Supervisor所管理 redis配置文件如下:
  1. 7 E7 R; I1 ^1 W: \+ v* D6 E! m3 W
  2. cat redis6001.conf  A! [; D' a& t* h) ?4 U3 ~
  3. port 6001
    $ {6 p1 Y% S) e
  4. bind 192.168.31.230) [" Q8 q  Y: G# i6 W# J" G
  5. protected-mode yes, H5 M) r9 ]  W
  6. pidfile "/usr/local/redis/run/redis6001.pid"% h& {- [. F% r1 h
  7. loglevel notice
    - w2 |6 [3 Y+ J4 B6 Y2 K5 a7 U. h7 |
  8. logfile "/usr/local/redis/logs/redis6001.log"
    / _4 U/ {. W+ _, @/ h) w
  9. save 900 14 Y( T" g& d& `* @
  10. stop-writes-on-bgsave-error yes
    . ]/ K" \3 |* Y! i; ~
  11. rdbcompression yes2 V# J9 O& ~0 d0 @/ b. J
  12. rdbchecksum  yes
    9 \' [6 L) X* B7 d
  13. dbfilename dump.rdb
    9 l1 W0 Y: r0 C4 N# r# G4 j
  14. dir "/usr/local/redis/data/rdb/"
    ' l  R2 y3 B9 W" ]& z
  15. timeout 0" h$ g) F. ?7 E3 F* d1 H
  16. tcp-keepalive 300
复制代码
- K% b$ U' a  ~) h  U. L
编写redis被Supervisor管理的案例
  1. , V9 @1 H/ X  e! p" ^% y
  2. vim /etc/supervisord.d/redis.conf% ~" N5 \9 \+ C- _" S  r' B3 r7 L
  3. [program:redis]+ _. N. g4 Z8 `0 i' H! q1 ^) w, r
  4. directory=/usr/local/redis
    , Y* ~4 v: K: T+ K: J  {
  5. command=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis6001.conf
      y& ^# _5 o0 r. j
  6. autostart=true
    6 v6 x! M2 ~$ [2 m% o; K( C) d
  7. startsecs=10. t0 |+ U+ N. ?; C: f4 D, y
  8. autorestart=true( t2 e/ j9 g$ G- v
  9. startretries=3/ Q9 Z3 \8 |6 H. _2 j/ h
  10. user=root
    6 q. b( ?+ O" ]! u1 k
  11. priority=999
    / t. u; k: `3 @+ O# S
  12. stopsignal=INT
    / \: C$ @5 b. z4 k
  13. redirect_stderr=true+ v! B' D  f7 |& m5 W
  14. stdout_logfile_maxbytes=200MB2 T- f* \( |. Q" J1 [5 M$ @
  15. stdout_logfile_backups = 100
    7 z7 k; t/ J2 H7 f# f
  16. stdout_logfile=/usr/local/redis/logs/redis6001.log
    % u# ~0 ^' P: }: g0 u
  17. stopasgroup=false
    ; T$ U. O! T( F. p6 d
  18. killasgroup=false
复制代码
$ `0 ?- H" M5 t+ N
使用super启动redis

  1. 5 ?3 u2 ^: N" n  @1 N$ v% I
  2. #关闭tomcat
    0 k  Z, R' z# j7 K
  3. supervisorctl stop tomcat
    ' f; N7 w  L5 w' f
  4. tomcat: stopped: m5 ?2 Y' m& Y& I; S. G! N

  5. $ J# ?; n3 M! c! t' f0 T$ j. b* a" f
  6. #杀掉supervisord
    * _4 C. w2 N1 h1 M
  7. ps -ef|grep supervisord9 Z. _& q' r: C, [, y5 e
  8. root     26927     1  0 10:47 ?        00:00:00 /usr/bin/python /bin/supervisord -c /etc/supervisord.conf9 T7 J' `! L- t0 y1 k$ ^
  9. root     27549 27402  0 11:07 pts/2    00:00:00 grep --color=auto super/ r' B, G* t# ]3 ]
  10. kill -9 26927
    ! M& O5 N/ \; x! M6 ?" E
  11. 6 g) E1 T; B- E
  12. #重新启动supervisord使其重新加载配置文件,supervisord默认会把redis和tomcat都拉起来
    2 `+ \3 J" [' `. g" t, B3 _& J
  13. supervisord -c /etc/supervisord.conf
复制代码
+ k) Z) ~" L- R. R
程序管理

  1. + D! j( h6 P" `: E% }
  2. supervisorctl status redis                              #redis状态+ T6 w( r& L  Q* {1 ~3 p2 L; z3 P
  3. supervisorctl stop redis                                #停止redis
    7 e# b6 r+ p0 i  B
  4. supervisorctl start redis                               #启动redis
    # M' H4 [/ S* [0 V1 C1 f( D
  5. supervisorctl restart reids                             #重启redis
    9 S4 Y8 v: x+ U3 A* Z8 u
  6. supervisorctl reoload redis                             #重载redis
复制代码

/ g' b3 h# R6 X& M
程序管理
程序管理

  1. / V+ C/ a' Q# k
  2. supervisorctl status all                            #查看所有进程状态( T( P( a6 T6 h5 t+ Z2 m
  3. supervisorctl stop   all                            #停止所有进程
    % t. Y" o, a9 }0 C
  4. supervisorctl start  all                            #启动所有进程& X+ h0 M" d# m+ c0 w, V# s4 z' Q3 L
  5. supervisorctl restart all                           #重启所有进程) \6 R0 _+ @& Q0 m; k# _
  6. supervisorctl reoload all                           #重载所有进程
复制代码
5 }' z' W- S2 I) D! i
Supervisord开启启动配置
9 j" A4 B, X; d7 ~* G

  1. # y$ B( B8 D3 ^; X0 e
  2. vim /usr/lib/systemd/system/supervisord.service
    / k" n1 z5 K0 V/ L5 u
  3. [Unit]
    2 n; T+ o. \6 N
  4. Description=Process Monitoring and Control Daemon
    ' F: y3 N9 f- c' r4 N7 ]
  5. After=rc-local.service nss-user-lookup.target
    / @4 j- o9 i" e9 \" n# V
  6. 5 f; w8 F6 Y9 a# `
  7. [Service]0 O4 |# p( R/ ~! i; v
  8. Type=forking
    4 f1 J# C# z$ N9 S1 l
  9. ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf6 N- ?! v" }, y0 [# Z
  10. 2 ~5 w8 f! m5 U( e: _6 k
  11. [Install]8 y( A2 g, U3 X3 R. g" b
  12. WantedBy=multi-user.target
复制代码
  1. # K, m8 i. s/ B2 V( N! ]3 }
  2. systemctl enable supervisord
    & G8 ^6 U4 m" O2 Q) F! T. }& x
  3. systemctl is-enabled supervisord
复制代码

% F$ y1 w4 E0 S. ?, ^
% u4 [( S! t3 U. p5 m

: R1 Q" f' o% S# ^: m9 ?! I9 R& C
赞 收藏 评论0 发布时间:2020-6-9 11:48

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版