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
(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
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程序的目錄。
能夠經過運行echo_supervisord_conf程序生成supervisor的初始化配置文件,以下所示:
#測試是否安裝成功
echo_supervisord_conf
#建立配置文件
echo_supervisord_conf > /etc/supervisor/supervisord.conf
------------------------------------------------------------------------------------------------------------------------------------------------------
安裝tomcat過程:
一.下載安裝對應的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)
測試成功
下載地址:
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
[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" />
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
......
------------------------------------------------------------------------------------------------------------------------------------------------------
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中
[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信號,包括子進程
[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
(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訪權限,將下面的配置(取消註釋):
修改爲:
錯誤②:
[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
(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,並設置開機啓動
注意:修改腳本中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文件:
☻服務端口
<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
附:
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