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



配置测试:

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.gz  https://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)

测试成功


安装Tomcat(http://tomcat.apache.org/)

下载地址:

apache-tomcat-8.0.27.tar.gz https://share.weiyun.com/57PQ94r 

[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 
修改
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
更改为
    <Connector port="8080" protocol="HTTP/1.1"
               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 <topic>):
=====================================
add    clear  fg        open  quit    remove  restart   start   stop  update 
avail  exit   maintail  pid   reload  reread  shutdown  status  tail  version

supervisor> help stop
stop <name>             Stop a process
stop <gname>:*          Stop all processes in a group
stop <name> <name>      Stop multiple processes or groups
stop all                Stop all processes
supervisor> quit

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

输入help可以查看可以执行的命令列表,如果想看某个命令的作用,运行help 命令名称,如:help stop

stop 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:登录管理后台的密码

QQ截图20180625202435.png


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文件:

  1.  ☻服务端口

<Server port="8005" shutdown="SHUTDOWN">

  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />

访问连接端口

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

 <Connector port="8080" protocol="HTTP/1.1"

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

               redirectPort="8443" />

与HTTP服务器连接端口

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

 <!-- Define an AJP 1.3 Connector on port 8009 -->

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

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

 <       <Host name="localhost"  appBase="/application/tomcat/webapps/memtest"


[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

QQ截图20180703180052.png




附:

Python包管理工具(easy_install)   http://down.51cto.com/data/2448286 

supervisor-3.1.3.tar          http://down.51cto.com/data/2448338   

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

apache-tomcat-8.0.27.tar.gz   http://down.51cto.com/data/2448652   https://share.weiyun.com/57PQ94r