[1]supervisor的使用管理:實現對異常中斷的子進程的自動重啓(以tomcat爲例)

1 介紹:php

  Linux的後臺進程運行有好幾種方法,例如nohup,screen等,可是,若是是一個服務程序,要可靠地在後臺運行,咱們就須要把它作成daemon,最好還能監控進程狀態,在乎外結束時能自動重啓。 
  supervisor就是用Python開發的一套通用的進程管理程序,能將一個普通的命令行進程變爲後臺daemon,並監控進程狀態,異常退出時能自動重啓。 html

Supervisor的做用與配置:實現對異常中斷的子進程的自動重啓java


  Supervisor(http://supervisord.org/)是用Python開發的一個client/server服務,是Linux/Unix系統下的一個進程管理工具,不支持Windows系統。它能夠很方便的監聽、啓動、中止、重啓一個或多個進程。用Supervisor管理的進程,當一個進程意外被殺死,supervisort監聽到進程死後,會自動將它從新拉起,很方便的作到進程自動恢復的功能,再也不須要本身寫shell腳原本控制。python

  supervisor管理進程工具,是經過fork/exec的方式將這些被管理的進程看成supervisor的子進程來啓動,因此咱們只須要將要管理進程的可執行文件的路徑添加到supervisor的配置文件中就行了。此時被管理進程被視爲supervisor的子進程,若該子進程異常中斷,則父進程能夠準確的獲取子進程異常中斷的信息,經過在配置文件中設置autostart=ture,能夠實現對異常中斷的子進程的自動重啓。linux

  主要就兩個命令:web

supervisord : supervisor的服務器端部分,啓動supervisor就是運行這個命令redis

supervisorctl:啓動supervisor的命令行窗口。docker

  由於Supervisor是Python開發的,安裝前先檢查一下系統否安裝了Python2.4以上版本。下面以CentOS7,Python2.7版本環境下,介紹Supervisor的安裝與配置步聚:shell

2 安裝:

(1)第一種安裝supervisor:apache

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的三、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

三、修改文件權限爲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 

相關文章
相關標籤/搜索