python supervisor 检测代码变动重启_[1]supervisor的使用管理:实现对异常中断的子进程的自动重启(以tomcat为例)...

1 介绍:

Linux的后台进程运行有好几种方法,例如nohup,screen等,但是,如果是一个服务程序,要可靠地在后台运行,我们就需要把它做成daemon,最好还能监控进程状态,在意外结束时能自动重启。

supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。

Supervisor的作用与配置:实现对异常中断的子进程的自动重启

Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。

supervisor管理进程工具,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以我们只需要将要管理进程的可执行文件的路径添加到supervisor的配置文件中就好了。此时被管理进程被视为supervisor的子进程,若该子进程异常中断,则父进程可以准确的获取子进程异常中断的信息,通过在配置文件中设置autostart=ture,可以实现对异常中断的子进程的自动重启。

主要就两个命令:

supervisord : supervisor的服务器端部分,启动supervisor就是运行这个命令

supervisorctl:启动supervisor的命令行窗口。

因为Supervisor是Python开发的,安装前先检查一下系统否安装了Python2.4以上版本。下面以CentOS7,Python2.7版本环境下,介绍Supervisor的安装与配置步聚:

2 安装:

(1)第一种安装supervisor:

pip install  supervisor

pip的安装cat  pip_an.sh

#!/bin/bash

wget

tar zxvf setuptools-0.6c11.tar.gz 5 cd setuptools-0.6c11

python setup.py build

python setup.py install

wget "

tar -xzvf pip-1.5.4.tar.gz

cd pip-1.5.411

python setup.py install

(2)第二种安装supervisor

安装Python包管理工具(easy_install)

easy_install是setuptools包里带的一个命令,使用easy_install实际上是在调用setuptools来完成安装模块的工作,所以安装setuptools即可。[root@docker1 ~]# cd /home

[root@docker1 home]# wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py -O - | python

[root@docker1 home]# unzip setuptools-33.1.1.zip

[root@docker1 home]# cd setuptools-33.1.1

[root@docker1 setuptools-33.1.1]# ls

bootstrap.py  conftest.py  easy_install.py  LICENSE      msvc-build-launcher.cmd  PKG-INFO       pytest.ini  setup.cfg  setuptools           tests

CHANGES.rst   docs         launcher.c       MANIFEST.in  pavement.py              pkg_resources  README.rst  setup.py   setuptools.egg-info  tox.ini

[root@docker1 setuptools-33.1.1]# python setup.py install

......

yum install python-setuptools

easy_install supervisor

(3)第三种安装supervisor(推荐使用这种安装方式)

wget https://pypi.python.org/packages/source/s/supervisor/supervisor-3.1.3.tar.gz

tar zxvf supervisor-3.1.3.tar.gz

cd supervisor-3.1.3

python setup.py install

(4)第四种安装supervisor

yum install -y epel-release

yum install -y supervisor

3 配置测试:

supervisor安装完成后会生成三个执行程序:supervisortd、supervisorctl、echo_supervisord_conf,分别是

supervisor的守护进程服务(用于接收进程管理命令)、

客户端(用于和守护进程通信,发送管理进程的指令)、

生成初始配置文件程序。

运行supervisord服务的时候,需要指定supervisor配置文件,如果没有显示指定,默认在以下目录查找:$CWD/supervisord.conf

$CWD/etc/supervisord.conf

/etc/supervisord.conf

/etc/supervisor/supervisord.conf (since Supervisor 3.3.0)

../etc/supervisord.conf (Relative to the executable)

../supervisord.conf (Relative to the executable)

$CWD表示运行supervisord程序的目录。

可以通过运行echo_supervisord_conf程序生成supervisor的初始化配置文件,如下所示:mkdir /etc/supervisor

echo_supervisord_conf > /etc/supervisor/supervisord.conf

#测试是否安装成功

echo_supervisord_conf

#创建配置文件

echo_supervisord_conf > /etc/supervisor/supervisord.conf

------------------------------------------------------------------------------------------------------------------------------------------------------

安装tomcat过程:

①部署java环境

一.下载安装对应的jdk,并配置Java环境。

下载地址:

jdk-8u60-linux-x64.tar.gzhttps://share.weiyun.com/5I4VPLS

下载将jdk解压后放到/usr/local目录下:

[root@docker1 home]# cd /usr/local/

[root@docker1 local]# rz -y

rz waiting to receive.

Starting zmodem transfer.  Press Ctrl+C to cancel.

Transferring jdk-8u60-linux-x64.tar.gz...

100%  176990 KB    11799 KB/sec    00:00:15       0 Errors

[root@docker1 local]# tar -xf jdk-8u60-linux-x64.tar.gz

[root@docker1 local]# ls

bin  etc  extundelete  games  include  jdk1.8.0_60  jdk-8u60-linux-x64.tar.gz  lib  lib64  libexec  sbin  share  src

建立/usr/local/下的jdk软连接方便以后版本升级 :

[root@docker1 local]# ln -s /usr/local/jdk1.8.0_60/ /usr/local/jdk

[root@docker1 local]# ls

bin  etc  extundelete  games  include  jdk  jdk1.8.0_60  jdk-8u60-linux-x64.tar.gz  lib  lib64  libexec  sbin  share  src

配置环境变量:

在 /etc/profile 中加入以下内容

JAVA_HOME=/usr/local/jdk1.8.0_60

JAVA_BIN=/usr/local/jdk1.8.0_60/bin

PATH=$PATH:$JAVA_BIN

CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export JAVA_HOME JAVA_BIN PATH CLASSPATH

保存退出

[root@docker1 local]# source /etc/profile

查看java环境变量是否生效

[root@docker1 local]# java -version

openjdk version "1.8.0_151"

OpenJDK Runtime Environment (build 1.8.0_151-b12)

OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)

测试成功

下载地址:

[root@docker1 local]# cd /home

[root@docker1 home]# rz -y

rz waiting to receive.

Starting zmodem transfer.  Press Ctrl+C to cancel.

Transferring apache-tomcat-8.0.27.tar.gz...

100%    8914 KB    8914 KB/sec    00:00:01       0 Errors

[root@docker1 home]# tar -xf apache-tomcat-8.0.27.tar.gz

[root@docker1 home]# mv apache-tomcat-8.0.27/ /usr/local/apache-tomcat-8.0.27

[root@docker1 home]# cd /usr/local/

[root@docker1 local]# ln -s /usr/local/apache-tomcat-8.0.27/ /usr/local/tomcat

[root@docker1 local]# cd tomcat/bin/

[root@docker1 bin]# ls

bootstrap.jar  catalina-tasks.xml  configtest.bat  digest.bat  setclasspath.sh  startup.bat  tomcat-native.tar.gz  version.bat

catalina.bat   commons-daemon.jar  configtest.sh   digest.sh   shutdown.bat   startup.sh    tool-wrapper.bat    version.sh

catalina.sh   commons-daemon-native.tar.gz  daemon.sh    setclasspath.bat  shutdown.sh    tomcat-juli.jar  tool-wrapper.sh

[root@docker1 bin]# echo "CATALINA_HOME=/usr/local/apache-tomcat-8.0.27/" >> catalina.sh

③Tomcat安全优化和性能优化

7.2.1 屏蔽dns查询enableLookups="false"[root@docker1 conf]# cat server.xml

修改

connectionTimeout="20000"

redirectPort="8443" />

更改为

connectionTimeout="6000" enableLookups="flase" acceptCount="800"

redirectPort="8443" />

7.2.2 jvm调优

Tomcat最吃内存,只要内存足够,这只猫就跑的很快。

如果系统资源有限,那就需要进行调优,提高资源使用率。

1. 优化catalina.sh配置文件。在catalina.sh配置文件中添加以下代码:

2.

3. JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"

4.

5. server:一定要作为第一个参数,在多个CPU时性能佳

6. -Xms:初始堆内存Heap大小,使用的最小内存,cpu性能高时此值应设的大一些

7. -Xmx:初始堆内存heap最大值,使用的最大内存

8. 上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。

9. -XX:PermSize:设定内存的永久保存区域

10. -XX:MaxPermSize:设定最大内存的永久保存区域

11. -XX:MaxNewSize:

12. -Xss 15120 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.

13. +XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。

14. -Xss:每个线程的Stack大小

15. -verbose:gc 现实垃圾收集信息

16. -Xloggc:gc.log 指定垃圾收集日志文件

17. -Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一

18. -XX:+UseParNewGC :缩短minor收集的时间

19. -XX:+UseConcMarkSweepGC :缩短major收集的时间

④启动tomcat服务器

[root@docker1 bin]# ./startup.sh

Using CATALINA_BASE:   /usr/local/tomcat

Using CATALINA_HOME:   /usr/local/tomcat

Using CATALINA_TMPDIR: /usr/local/tomcat/temp

Using JRE_HOME:        /usr/local/jdk1.8.0_60

Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

Tomcat started.

[root@docker1 bin]# ./shutdown.sh

Using CATALINA_BASE:   /usr/local/tomcat

Using CATALINA_HOME:   /usr/local/tomcat

Using CATALINA_TMPDIR: /usr/local/tomcat/temp

Using JRE_HOME:        /usr/local/jdk1.8.0_60

Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

[root@docker1 bin]# ./catalina.sh run

Using CATALINA_BASE:   /usr/local/tomcat

Using CATALINA_HOME:   /usr/local/tomcat

Using CATALINA_TMPDIR: /usr/local/tomcat/temp

Using JRE_HOME:        /usr/local/jdk1.8.0_60

Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

......

------------------------------------------------------------------------------------------------------------------------------------------------------

supervisord.conf配置文件参数说明

supervisor的配置参数较多,下面介绍一下常用的参数配置,详细的配置及说明,请参考官方文档介绍。

注:分号(;)开头的配置表示注释[root@docker1 supervisor]# cat supervisord.conf          (supervisord.conf权限默认644,无需更改)

[unix_http_server]

file=/var/run/supervisor/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和端口,如果开放到公网,需要注意安全性

port=10.0.0.10:9001            ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性

username=user                  ;登录管理后台的用户名

password=123                   ;登录管理后台的密码

[supervisord]

logfile=/var/run/supervisor/supervisord.log ;日志文件,默认是$CWD/supervisord.log

logfile_maxbytes=50MB        ;日志文件大小,超出会rotate替换,默认50MB,如果设成0,表示不限制大小

logfile_backups=10           ;日志文件保留备份数量默认10,设为0表示不备份

loglevel=info                ;日志级别,默认info,其他:debug,warn,trace

pidfile=/tmp/supervisord.pid ;pid文件

nodaemon=false               ;是否在前台启动,默认是false,即以daemon的方式启动

minfds=1024                  ;可以打开的文件描述符的最小值,默认1024

minprocs=200                 ;可以打开的进程数的最小值,默认200

[supervisorctl]

password=123                   ;登录管理后台的密码

[supervisord]

logfile=/var/run/supervisor/supervisord.log ;日志文件,默认是$CWD/supervisord.log

logfile_maxbytes=50MB        ;日志文件大小,超出会rotate替换,默认50MB,如果设成0,表示不限制大小

logfile_backups=10           ;日志文件保留备份数量默认10,设为0表示不备份

[unix_http_server]

file=/var/run/supervisor/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和端口,如果开放到公网,需要注意安全性

port=10.0.0.10:9001            ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性

username=user                  ;登录管理后台的用户名

password=123                   ;登录管理后台的密码

[supervisord]

logfile=/var/run/supervisor/supervisord.log ;日志文件,默认是$CWD/supervisord.log

logfile_maxbytes=50MB        ;日志文件大小,超出会rotate替换,默认50MB,如果设成0,表示不限制大小

logfile_backups=10           ;日志文件保留备份数量默认10,设为0表示不备份

loglevel=info                ;日志级别,默认info,其他:debug,warn,trace

pidfile=/tmp/supervisord.pid ;pid文件

nodaemon=false               ;是否在前台启动,默认是false,即以daemon的方式启动

minfds=1024                  ;可以打开的文件描述符的最小值,默认1024

minprocs=200                 ;可以打开的进程数的最小值,默认200

[supervisorctl]

serverurl=unix:///var/run/supervisor/supervisor.sock    ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致

;serverurl=http://127.0.0.1:9001                        ;通过HTTP的方式连接supervisord

[program:supervisor_tomcat1]                   ;[program:xx]是被管理的进程配置参数,xx是进程的名称

command=/usr/local/apache-tomcat-8.0.27/bin/catalina.sh run      ;在supervisord启动的时候也自动启动

autostart=true                 ;在supervisord启动的时候也自动启动

startsecs=10                   ;启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒

autorestart=true               ;程序退出后自动重启,可选值:[unexpected,true,flase],默认为unexpected,表示进程意味杀死后才重启

startretries=3                 ;启动失败自动重试次数,默认是3

;user=tomcat                    ;用哪个用户启动进程,默认是root

user=root

priority=999                   ;进行启动优先级,默认999,值小的优先启动

redirect_stderr=true           ;把stderr重定向到stdout,默认false

stdout_logfile_maxbytes=20MB   ;stdout日志文件大小,默认50MB

stdout_logfile_backups=20      ;stdout日志文件备份数,默认是10

;stdout日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord会自动创建日志文件)

stdout_logfile=/usr/local/apache-tomcat-8.0.27/logs/catalina.out

stopasgroup=false              ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程

killasgroup=false              ;默认为false,向进程组发送kill信号,包括子进程

;包含其他配置文件

[include]

;files = relative/directory/*.ini       ;可以指定一个或多个以.ini结束的配置文件

files = /etc/supervisor/config.d/*.ini

[rpcinterface:supervisor]              #不添加这行,后续启动后会有错误①

supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

错误①:

[root@docker1 supervisor]# supervisorctl     #启动后报错

Sorry, supervisord responded but did not recognize the supervisor namespace commands that supervisorctl uses to control it.  Please check that the [rpcinterface:supervisor] section is enabled in the configuration file (see sample.conf).

supervisor>

include示例:

[include]

files = /opt/absolute/filename.ini /opt/absolute/.*ini foo.conf config??.ini

配置管理进程

进程管理配置参数,不建议全都写在supervisord.conf文件中,应该每个进程写一个配置文件放在include指定的目录下包含进supervisord.conf文件中。

1> 创建/etc/supervisor/config.d目录,用于存放进程管理的配置文件

2> 修改/etc/supervisor/supervisord.conf中的include参数,将/etc/supervisor/conf.d目录添加到include中[include]

files = /etc/supervisor/config.d/*.ini

[root@docker1 supervisor]# mkdir conf.d

[root@docker1 supervisor]# ls

conf.d  supervisord.conf

下面是配置Tomcat进程的一个例子:[root@docker1 supervisor]# cd conf.d/

[root@docker1 conf.d]# vi tomcat.ini

[program:tomcat]               ;[program:xx]是被管理的进程配置参数,tomcat是进程的名称

command=/usr/local/apache-tomcat-8.0.27/bin/catalina.sh run      ;在supervisord启动的时候也自动启动

autostart=true                 ;在supervisord启动的时候也自动启动

startsecs=10                   ;启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒

autorestart=true               ;程序退出后自动重启,可选值:[unexpected,true,flase],默认为unexpected,表示进程意味杀死后才重启

startretries=3                 ;启动失败自动重试次数,默认是3

user=tomcat                    ;用哪个用户启动进程,默认是root

priority=999                   ;进行启动优先级,默认999,值小的优先启动

redirect_stderr=true           ;把stderr重定向到stdout,默认false

stdout_logfile_maxbytes=20MB   ;stdout日志文件大小,默认50MB

stdout_logfile_backups=20      ;stdout日志文件备份数,默认是10

;stdout日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord会自动创建日志文件)

stdout_logfile=/usr/local/apache-tomcat-8.0.27/logs/catalina.out

stopasgroup=false              ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程

killasgroup=false              ;默认为false,向进程组发送kill信号,包括子进程

启动Supervisor服务

[root@docker1 supervisor]# supervisord -c /etc/supervisor/supervisord.conf

Error: The directory named as part of the path /var/run/supervisor/supervisord.log does not exist.

For help, use /usr/bin/supervisord -h

[root@docker1 supervisor]# mkdir /var/run/supervisor/

[root@docker1 supervisor]# supervisord -c /etc/supervisor/supervisord.conf    # 指定配置文件启动supervisord

控制进程

(1)交互式终端

supervisord启动成功后,可以通过supervisorctl客户端控制进程,启动、停止、重启。运行supervisorctl命令,不加参数,会进入supervisor客户端的交互终端,并会列出当前所管理的所有进程。[root@docker1 local]# supervisorctl -c /etc/supervisor/supervisord.conf

supervisor_tomcat1               RUNNING   pid 23080, uptime 0:00:31

supervisor> help

default commands (type help ):

=====================================

add    clear  fg        open  quit    remove  restart   start   stop  update

avail  exit   maintail  pid   reload  reread  shutdown  status  tail  version

supervisor> help stop

stop              Stop a process

stop :*          Stop all processes in a group

stop        Stop multiple processes or groups

stop all                Stop all processes

supervisor> quit

上面的supervisor_tomcat1就是我们在配置文件中[program:supervisor_tomcat1]指定的名字。

输入help可以查看可以执行的命令列表,如果想看某个命令的作用,运行help 命令名称,如:help stopstop tomcat  // 表示停止tomcat进程

stop all     // 表示停止所有进程

(2)bash终端

supervisorctl stop program_name   # 停止某一个进程,program_name 为 [program:x] 里的 x

supervisorctl start program_name   # 启动某个进程

supervisorctl restart program_name  # 重启某个进程

supervisorctl stop groupworker:    # 结束所有属于名为 groupworker 这个分组的进程 (start,restart 同理)

supervisorctl stop groupworker:name1  # 结束 groupworker:name1 这个进程 (start,restart 同理)

supervisorctl stop all                # 停止全部进程,注:start、restartUnlinking stale socket /tmp/supervisor.sock、stop 都不会载入最新的配置文件

supervisorctl reload    # 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程supervisorctl update  # 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启

supervisor基本命令(后四个命令可以省略“-c supervisor.conf”):

supervisord -c supervisor.conf                通过配置文件启动supervisor

supervisorctl -c supervisor.conf status          查看状态

supervisorctl -c supervisor.conf reload          重新载入配置文件

supervisorctl -c supervisor.conf start [all]|[x]    启动所有/指定的程序进程

supervisorctl -c supervisor.conf stop [all]|[x]     关闭所有/指定的程序进程

supervisorctl status

supervisorctl stop tomcat

supervisorctl start tomcat

supervisorctl restart tomcat

supervisorctl reread

supervisorctl update

(3)web管理界面(生产环境最好关闭)

出于安全考虑,默认配置是没有开启web管理界面,需要修改supervisord.conf配置文件打开http访权限,将下面的配置(取消注释):

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

修改成:[inet_http_server]         ; inet (TCP) server disabled by default

port=127.0.0.1:9001          ; (ip_address:port specifier, *:port for all iface)  #这一行不加会出现错误②

port=10.0.0.10:9001

username=user              ; (default is no username (open server))

password=123               ; (default is no password (open server))

错误②:

[root@docker1 logs]# supervisorctl

http://localhost:9001 refused connection

supervisor>

解决:指定配置文件

[root@docker1 local]# supervisorctl -c /etc/supervisor/supervisord.conf reload

Restarted supervisord

[root@docker1 local]# supervisorctl -c /etc/supervisor/supervisord.conf

supervisor_tomcat1               RUNNING   pid 23080, uptime 0:11:12

supervisor>

重启方法1:

[root@docker1 supervisor]# supervisorctl reload

重启方法2:

[root@docker1 supervisor]# ps -ef|grep sup

root      15602      1  0 15:05 ?        00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf

root      16247   3526  0 15:15 pts/0    00:00:00 grep --color=auto sup

[root@docker1 supervisor]# kill -9 15602

[root@docker1 supervisor]# supervisord -c /etc/supervisor/supervisord.conf

port:绑定访问IP和端口,这里是绑定的是本地IP和9001端口

username:登录管理后台的用户名

password:登录管理后台的密码

web界面的Restart能够对supervisor_tomcat1重启,stop对tomcat1关闭,clear Log对logs/catalina.out的内容自动清除

(4)测试是否实现对异常中断的子进程的自动重启

[root@docker1 local]# ps -ef |grep tomcat

root      23080  22624  1 20:22 ?        00:00:03 /usr/local/jdk1.8.0_60/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-8.0.27/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-8.0.27/endorsed -classpath /usr/local/apache-tomcat-8.0.27/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.27/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-8.0.27 -Dcatalina.home=/usr/local/apache-tomcat-8.0.27 -Djava.io.tmpdir=/usr/local/apache-tomcat-8.0.27/temp org.apache.catalina.startup.Bootstrap start

root      23279  21375  0 20:25 pts/1    00:00:00 grep --color=auto tomcat

[root@docker1 local]# kill -9 23080               #单独杀死tomcat,发现PID 23080 变为 23287

[root@docker1 local]# ps -ef |grep tomcat

root      23287  22624 95 20:25 ?        00:00:00 /usr/local/jdk1.8.0_60/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-8.0.27/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-8.0.27/endorsed -classpath /usr/local/apache-tomcat-8.0.27/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.27/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-8.0.27 -Dcatalina.home=/usr/local/apache-tomcat-8.0.27 -Djava.io.tmpdir=/usr/local/apache-tomcat-8.0.27/temp org.apache.catalina.startup.Bootstrap start

root      23304  21375  0 20:26 pts/1    00:00:00 grep --color=auto tomcat

[root@docker1 local]# supervisorctl -c /etc/supervisor/supervisord.conf reload     #重启supervisor,发现tomcat PID 23287 变为 23336

Restarted supervisord

[root@docker1 local]# ps -ef |grep tomcat

root      23336  22624 99 20:26 ?        00:00:01 /usr/local/jdk1.8.0_60/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-8.0.27/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-8.0.27/endorsed -classpath /usr/local/apache-tomcat-8.0.27/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.27/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-8.0.27 -Dcatalina.home=/usr/local/apache-tomcat-8.0.27 -Djava.io.tmpdir=/usr/local/apache-tomcat-8.0.27/temp org.apache.catalina.startup.Bootstrap start

root      23354  21375  0 20:26 pts/1    00:00:00 grep --color=auto tomcat

[root@docker1 local]# ps -ef |grep super

root      22624      1  0 20:14 ?        00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf

root      23395  21375  0 20:27 pts/1    00:00:00 grep --color=auto super

[root@docker1 local]# kill -9 22624                                               #杀死supervisor进程,发现tomcat的进程PID不变

[root@docker1 local]# ps -ef |grep super

root      23404  21375  0 20:27 pts/1    00:00:00 grep --color=auto super

[root@docker1 local]# ps -ef |grep tomcat

root      23336      1  3 20:26 ?        00:00:02 /usr/local/jdk1.8.0_60/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-8.0.27/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-8.0.27/endorsed -classpath /usr/local/apache-tomcat-8.0.27/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.27/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-8.0.27 -Dcatalina.home=/usr/local/apache-tomcat-8.0.27 -Djava.io.tmpdir=/usr/local/apache-tomcat-8.0.27/temp org.apache.catalina.startup.Bootstrap start

root      23409  21375  0 20:27 pts/1    00:00:00 grep --color=auto tomcat

开机启动Supervisor服务

(1)配置systemctl服务

1> 进入/lib/systemd/system目录,并创建supervisor.service文件[root@docker1 /]# cd /lib/systemd/system

[root@docker1 system]# vi supervisor.service

[Unit]

Description=supervisor

After=network.target

[Service]

Type=forking

ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf

ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown

ExecReload=/usr/bin/supervisorctl $OPTIONS reload

KillMode=process

Restart=on-failure

RestartSec=42s

[Install]

WantedBy=multi-user.target

2> 设置开机启动[root@docker1 system]# systemctl enable supervisor.service

Created symlink from /etc/systemd/system/multi-user.target.wants/supervisor.service to /usr/lib/systemd/system/supervisor.service.

[root@docker1 system]# systemctl daemon-reload

3、修改文件权限为766

[root@docker1 system]# chmod 766 supervisor.service

(2)配置service类型服务

[root@docker1 init.d]# cd /etc/rc.d/init.d

[root@docker1 init.d]# cat supervisor

#!/bin/bash

#

# processname:  supervisord

# config: /etc/supervisor/supervisord.conf

# pidfile: /var/run/supervisord.pid

#

. /etc/rc.d/init.d/functions

RETVAL=0

start() {

echo -n $"Starting supervisord: "

daemon "supervisord -c /etc/supervisor/supervisord.conf "

RETVAL=$?

echo

[ $RETVAL -eq 0 ] && touch /var/lock/subsys/supervisord

}

stop() {

echo -n $"Stopping supervisord: "

killproc supervisord

echo

[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/supervisord

}

restart() {

stop

start

}

case "$1" in

start)

start

;;

stop)

stop

;;

restart|force-reload|reload)

restart

;;

condrestart)

[ -f /var/lock/subsys/supervisord ] && restart

;;

status)

status supervisord

RETVAL=$?

;;

*)

echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"

exit 1

esac

exit $RETVAL

修改文件权限为755,并设置开机启动chmod 755 /etc/rc.d/init.d/supervisor

chkconfig supervisor on

注意:修改脚本中supervisor配置文件路径为你的supervisor的配置文件路径

======================================重点=======================================

1. supervisor 比较适合监控业务应用,且只能监控前台程序,php fork方式实现的daemon不能用它监控,否则supervisor> status 会提示:BACKOFF  Exited too quickly (process log may have details)

2.每次修改配置文件后需进入supervisorctl,执行reload, 改动部分才能生效。

3.两个命令

supervisord : supervisor的服务器端部分,用于supervisor启动。

supervisorctl:启动supervisor的命令行窗口,在该命令行中可执行start、stop、status、reload等操作。

4.如果9001端口拒绝访问,服务器允许9001端口访问 ,保存iptables规则 。

[root@localhost ~]# iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 9001 -j ACCEPT

[root@localhost ~]# service iptables save

5.Supervisor只能管理非daemon的进程,也就是说Supervisor不能管理守护进程。否则提示Exited too quickly (process log may have details)异常。例子中的Tomcat默认是以守护进程启动的,所以我们改成了catalina.sh run,以前台进程的方式运行。

默认配置文件:/etc/supervisor/supervisord.conf

进程管理配置文件放到:/etc/supervisor/conf.d目录下即可

默认日志文件:/tmp/supervisord.log,可以查看进程的启动信息

------------------------------------------------------------------------------------

tomcat多实例的配置:

[root@docker1 ~]# cd /usr/local/

[root@docker1 local]# ls

apache-tomcat-8.0.27  etc  games   jdk    jdk-8u60-linux-x64.tar.gz  lib64    redis     sbin   src

bin   extundelete  include  jdk1.8.0_60  lib       libexec  redis_init_script  share  tomcat

[root@docker1 local]# cp -r apache-tomcat-8.0.27/ apache-tomcat-8.0.28/

[root@docker1 local]# cd apache-tomcat-8.0.28

[root@docker1 apache-tomcat-8.0.28]# ls

bin  conf  lib  LICENSE  logs  NOTICE  RELEASE-NOTES  RUNNING.txt  temp  webapps  work

[root@docker1 apache-tomcat-8.0.28]# cd bin/

[root@docker1 bin]# ls

bootstrap.jar  catalina-tasks.xml            configtest.bat  digest.bat        setclasspath.sh  startup.bat      tomcat-native.tar.gz  version.bat

catalina.bat   commons-daemon.jar            configtest.sh   digest.sh         shutdown.bat     startup.sh       tool-wrapper.bat      version.sh

catalina.sh    commons-daemon-native.tar.gz  daemon.sh       setclasspath.bat  shutdown.sh      tomcat-juli.jar  tool-wrapper.sh

[root@docker1 bin]# ./startup.sh

Using CATALINA_BASE:   /usr/local/apache-tomcat-8.0.28

Using CATALINA_HOME:   /usr/local/apache-tomcat-8.0.28

Using CATALINA_TMPDIR: /usr/local/apache-tomcat-8.0.28/temp

Using JRE_HOME:        /usr/local/jdk1.8.0_60

Using CLASSPATH:       /usr/local/apache-tomcat-8.0.28/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.28/bin/tomcat-juli.jar

Tomcat started.

[root@docker1 bin]# ps -ef |grep tomcat              #从这里看到tomcat并未启动,是由于端口冲突

root      84265  84264  0 16:38 ?        00:00:11 /usr/local/jdk1.8.0_60/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-8.0.27/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-8.0.27/endorsed -classpath /usr/local/apache-tomcat-8.0.27/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.27/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-8.0.27 -Dcatalina.home=/usr/local/apache-tomcat-8.0.27 -Djava.io.tmpdir=/usr/local/apache-tomcat-8.0.27/temp org.apache.catalina.startup.Bootstrap start

root      86747  78819  0 17:28 pts/1    00:00:00 grep --color=auto tomcat

需要修改apache-tomcat-8.0.28/conf/server.xml文件:

☻服务端口

☻访问连接端口

第一个连接器监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。

connectionTimeout="6000" enableLookups="flase" acceptCount="800"

redirectPort="8443" />

☻与HTTP服务器连接端口

第二个连接器监听8009端口,负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。

☻修改war的存放目录(如果需要的话)

<       

[root@docker1 bin]# ./startup.sh

Using CATALINA_BASE:   /usr/local/apache-tomcat-8.0.28

Using CATALINA_HOME:   /usr/local/apache-tomcat-8.0.28

Using CATALINA_TMPDIR: /usr/local/apache-tomcat-8.0.28/temp

Using JRE_HOME:        /usr/local/jdk1.8.0_60

Using CLASSPATH:       /usr/local/apache-tomcat-8.0.28/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.28/bin/tomcat-juli.jar

Tomcat started.

[root@docker1 bin]# ps -ef|grep tomcat

root      84265  84264  0 16:38 ?        00:00:12 /usr/local/jdk1.8.0_60/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-8.0.27/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-8.0.27/endorsed -classpath /usr/local/apache-tomcat-8.0.27/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.27/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-8.0.27 -Dcatalina.home=/usr/local/apache-tomcat-8.0.27 -Djava.io.tmpdir=/usr/local/apache-tomcat-8.0.27/temp org.apache.catalina.startup.Bootstrap start

root      87379      1 37 17:41 pts/1    00:00:03 /usr/local/jdk1.8.0_60/bin/java -Djava.util.logging.config.file=/usr/local/apache-tomcat-8.0.28/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/apache-tomcat-8.0.28/endorsed -classpath /usr/local/apache-tomcat-8.0.28/bin/bootstrap.jar:/usr/local/apache-tomcat-8.0.28/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/apache-tomcat-8.0.28 -Dcatalina.home=/usr/local/apache-tomcat-8.0.28 -Djava.io.tmpdir=/usr/local/apache-tomcat-8.0.28/temp org.apache.catalina.startup.Bootstrap start

root      87404  78819  0 17:41 pts/1    00:00:00 grep --color=auto tomcat

配置supervisor

[root@docker1 supervisor]# cat /etc/supervisor/supervisord.conf

......

;包含其他配置文件

[include]

;files = relative/directory/*.ini       ;可以指定一个或多个以.ini结束的配置文件

files = /etc/supervisor/config.d/*.ini

......

[root@docker1 supervisor]# cd /etc/supervisor/

[root@docker1 supervisor]# ls

supervisord.conf

[root@docker1 supervisor]# mkdir config.d

[root@docker1 supervisor]# cd config.d/

[root@docker1 config.d]# vi tomcat.ini

[program:supervisor_tomcat2]                   ;[program:xx]是被管理的进程配置参数,xx是进程的名称

command=/usr/local/apache-tomcat-8.0.28/bin/catalina.sh run      ;在supervisord启动的时候也自动启动

autostart=true                 ;在supervisord启动的时候也自动启动

startsecs=10                   ;启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒

autorestart=true               ;程序退出后自动重启,可选值:[unexpected,true,flase],默认为unexpected,表示进程意味杀死后才重启

startretries=3                 ;启动失败自动重试次数,默认是3

;user=tomcat                    ;用哪个用户启动进程,默认是root

user=root

priority=999                   ;进行启动优先级,默认999,值小的优先启动

redirect_stderr=true           ;把stderr重定向到stdout,默认false

stdout_logfile_maxbytes=20MB   ;stdout日志文件大小,默认50MB

stdout_logfile_backups=20      ;stdout日志文件备份数,默认是10

stdout_logfile=/usr/local/apache-tomcat-8.0.28/logs/catalina.out

stopasgroup=false              ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程

killasgroup=false              ;默认为false,向进程组发送kill信号,包括子进程

[root@docker1 supervisor]# supervisorctl update

supervisor_tomcat2: added process group

[root@docker1 supervisor]# supervisorctl

supervisor_tomcat1               RUNNING   pid 88429, uptime 0:00:23

supervisor_tomcat2               FATAL     Exited too quickly (process log may have details)

supervisor> stop supervisor_tomcat2    #需要多次执行start stop supervisor_tomcat2

supervisor_tomcat1: stopped

supervisor> start supervisor_tomcat2

supervisor_tomcat2: started

附:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值