Tomcat调优及JMX监控

Tomcat调优及JMX监控html

 

实验背景java

======================================================node

系统版本:CentOS release 6.5 (Final)算法

Tomcat版本:   Apache-tomcat-7.0.54express

 

Tomcat介绍:apache

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其余一些公司及我的共同开发而成。因为有了Sun 的参与和支持,最新的Servlet 和JSP 规范老是能在Tomcat 中获得体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。由于Tomcat 技术先进、性能稳定,并且免费,于是深受Java 爱好者的喜好并获得了部分软件开发商的承认,成为目前比较流行的Web 应用服务器。目前最新版本是8.0。bootstrap

======================================================vim

1
2
Tomcat 7最新版本下载连接:
http: //mirrors .cnnic.cn /apache/tomcat/tomcat-7/v7 .0.56 /bin/apache-tomcat-7 .0.56. tar .gz
1
2
Tomcat 安装:
tar  zxvf apache-tomcat-7.0.54. tar .gz -C  /opt/
1
2
3
4
5
6
7
8
jsvc编译及调优:
cd   apache-tomcat-7.0.54 /bin
tar  zxvf commons-daemon-native. tar .gz
cd  commons-daemon-1.0.x-native-src /unix
. /configure
make  -j4
cp  jsvc ../../
cd  ../../
1
2
添加tomcat用户,后面用来启动tomcat进程:
useradd  -s  /sbin/nologin  tomcat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
jsvc help文件:
# export JAVA_HOME=/opt/jdk1.7.0_60/
# ./jsvc --help
Usage: jsvc [-options] class [args...]
Where options include:
     -help | --help | -?
         show this help page (implies -nodetach)
     -jvm <JVM name>
         use a specific Java Virtual Machine. Available JVMs:
             'server'
     -client
         use a client Java Virtual Machine.
     -server
         use a server Java Virtual Machine.
     - cp  | -classpath <directories and zip /jar  files>
         set  search path  for  service classes and resouces
     -java-home | -home <directory>
         set  the path of your JDK or JRE installation (or  set
         the JAVA_HOME environment variable)
     -version
         show the current Java environment version (to check
         correctness of -home and -jvm. Implies -nodetach)
     -showversion
         show the current Java environment version (to check
         correctness of -home and -jvm) and  continue  execution.
     -nodetach
         don't detach from parent process and become a daemon
     -debug
         verbosely print debugging information
     -check
         only check service (implies -nodetach)
     -user <user>
         user used to run the daemon (defaults to current user)
     -verbose[:class|gc|jni]
         enable  verbose output
     -cwd < /full/path >
         set  working directory to given location (defaults to /)
     -outfile < /full/path/to/file >
         Location  for  output from stdout (defaults to  /dev/null )
         Use the value  '&2'  to simulate  '1>&2'
     -errfile < /full/path/to/file >
         Location  for  output from stderr (defaults to  /dev/null )
         Use the value  '&1'  to simulate  '2>&1'
     -pidfile < /full/path/to/file >
         Location  for  output from the  file  containing the pid of jsvc
         (defaults to  /var/run/jsvc .pid)
     -D<name>=<value>
         set  a Java system property
     -X<option>
         set  Virtual Machine specific option
     -ea[:<packagename>...|:<classname>]
     -enableassertions[:<packagename>...|:<classname>]
         enable  assertions
     -da[:<packagename>...|:<classname>]
     -disableassertions[:<packagename>...|:<classname>]
         disable assertions
     -esa | -enablesystemassertions
         enable  system assertions
     -dsa | -disablesystemassertions
         disable system assertions
     -agentlib:<libname>[=<options>]
         load native agent library <libname>, e.g. -agentlib:hprof
     -agentpath:<pathname>[=<options>]
         load native agent library by full pathname
     -javaagent:<jarpath>[=<options>]
         load Java programming language agent, see java.lang.instrument
     -procname <procname>
         use the specified process name
     -wait <waittime>
         wait waittime seconds  for  the service to start
         waittime should multiple of 10 (min=10)
     -stop
         stop the service using the  file  given  in  the -pidfile option
     -keepstdin
         does not redirect stdin to  /dev/null
jsvc (Apache Commons Daemon) 1.0.15-dev
Copyright (c) 1999-2013 Apache Software Foundation.

=============================================================浏览器

接下来是重点了!tomcat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
jsvc 调优参数:
export  PATH= /bin : /sbin : /usr/bin : /usr/sbin
export  JAVA_HOME= /opt/jdk1 .7.0_60
export  JRE_HOME= /opt/jdk1 .7.0_60 /jre
export  CATALINA_BASE= /opt/apache-tomcat-7 .0.54
export  CATALINA_HOME= /opt/apache-tomcat-7 .0.54
export  CATALINA_PID=$CATALINA_BASE /logs/catalina-daemon .pid
export  CATALINA_TMP=$CATALINA_BASE /temp
export  TOMCAT_USER=tomcat
export  CATALINA_OPTS="-server -Xss512k -Xms2048M -Xmx2048M -XX:MaxPermSize=256M -XX:PermSize=128M -XX:NewSize=128M -XX:+CMSIncreme
ntalMode -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:ParallelGCThreads=8 -Djavax.servlet.r
equest.encoding=UTF-8 -Djavax.servlet.response.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.timezone=Asia /Shanghai  -Dcom.sun.manage
ment.jmxremote -Dcom.sun.management.jmxremote.port=100861 -Dcom.sun.management.jmxremote.ssl= false  -Dcom.sun.management.jmxremote.a
uthenticate= false  -Djava.rmi.server. hostname =192.168.3.5"
1
2
-XX:+CMSIncrementalMode
该标志将开启CMS收集器的增量模式。增量模式常常暂停CMS过程,以便对应用程序线程做出彻底的让步。所以,收集器将花更长的时间完成整个收集周期。所以,只有经过测试后发现正常CMS周期对应用程序线程干扰太大时,才应该使用增量模式。因为现代服务器有足够的处理器来适应并发的垃圾收集,因此这种状况发生得不多。
1
2
3
-XX:CMSInitiatingOccupancyFraction
当堆满以后,并行收集器便开始进行垃圾收集,例如,当没有足够的空间来容纳新分配或提高的对象。对于CMS收集器,长时间等待是不可取的,由于在并发垃圾收集期间应用持续在运行(而且分配对象)。所以,为了在应用程序使用完内存以前完成垃圾收集周期,CMS收集器要比并行收集器更先启动。
由于不一样的应用会有不一样对象分配模式,JVM会收集实际的对象分配(和释放)的运行时数据,而且分析这些数据,来决定何时启动一次CMS垃圾收集周期。为了引导这一过程, JVM会在一开始执行CMS周期前做一些线索查找。该线索由 -XX:CMSInitiatingOccupancyFraction=<value>来设置,该值表明老年代堆空间的使用率。好比,value=75意味着第一次CMS垃圾收集会在老年代被占用75%时被触发。一般CMSInitiatingOccupancyFraction的默认值为68(以前很长时间的经从来决定的)。
1
2
-XX:+UseConcMarkSweepGC
该标志首先是激活CMS收集器。默认HotSpot JVM使用的是并行收集器。
1
2
3
-XX:UseParNewGC
当使用CMS收集器时,该标志激活年轻代使用多线程并行执行垃圾回收。这使人很惊讶,咱们不能简单在并行收集器中重用-XX:UserParNewGC标志,由于概念上年轻代用的算法是同样的。然而,对于CMS收集器,年轻代GC算法和老年代GC算法是不一样的,所以年轻代GC有两种不一样的实现,而且是两个不一样的标志。
注意最新的JVM版本,当使用-XX:+UseConcMarkSweepGC时,-XX:UseParNewGC会自动开启。所以,若是年轻代的并行GC不想开启,能够经过设置-XX:-UseParNewGC来关掉。
1
2
3
4
XX:ConcGCThreads
标志-XX:ConcGCThreads=<value>(早期JVM版本也叫-XX:ParallelCMSThreads)定义并发CMS过程运行时的线程数。好比value=4意味着CMS周期的全部阶段都以4个线程来执行。尽管更多的线程会加快并发CMS过程,但其也会带来额外的同步开销。所以,对于特定的应用程序,应该经过测试来判断增长CMS线程数是否真的可以带来性能的提高。
若是还标志未设置,JVM会根据并行收集器中的-XX:ParallelGCThreads参数的值来计算出默认的并行CMS线程数。该公式是ConcGCThreads = (ParallelGCThreads + 3) /4 。所以,对于CMS收集器, -XX:ParallelGCThreads标志不只影响“stop-the-world”垃圾收集阶段,还影响并发阶段。
总之,有很多方法能够配置CMS收集器的多线程执行。正是因为这个缘由,建议第一次运行CMS收集器时使用其默认设置, 而后若是须要调优再进行测试。只有在生产系统中测量(或类生产测试系统)发现应用程序的暂停时间的目标没有达到 , 就能够经过这些标志应该进行GC调优。
1
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
1
2
3
4
5
6
7
接下来这些参数 是针对于 JMX 远程监控的:
-Dcom.sun.management.jmxremote 启用JMX远程监控
-Dcom.sun.management.jmxremote.port=100861 使用端口100861
-Dcom.sun.management.jmxremote.authenticate= false  远程链接不须要密码认证
-Dcom.sun.management.jmxremote.ssl= false  不使用SSL
-Dcom.sun.management.jmxremote.access. file =$CATALINA_HOME /conf/jmxremote .access 使用指定的JMX账号受权文件
-Dcom.sun.management.jmxremote.password. file =$CATALINA_HOME /conf/jmxremote .password 使用指定的JMX账号文件

 

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

 

到这里为止 tomcat 针对jsvc 调优已经差很少了,下面启动tomcat 测试:

1
2
3
# cp ./daemon.sh /etc/init.d/tomcat
# chmod +x /etc/init.d/tomcat
# /etc/init.d/tomcat start
1
2
3
# ps -ef |grep tomcat
root     12166     1  0 16:09 ?        00:00:00 jsvc. exec  -java-home  /opt/jdk1 .7.0_60 -user tomcat -pidfile  /opt/apache-tomcat-7 .0.54 /logs/catalina-daemon .pid -wait 10 -outfile  /opt/apache-tomcat-7 .0.54 /logs/catalina-daemon .out -errfile &1 -classpath  /opt/apache-tomcat-7 .0.54 /bin/bootstrap .jar: /opt/apache-tomcat-7 .0.54 /bin/commons-daemon .jar: /opt/apache-tomcat-7 .0.54 /bin/tomcat-juli .jar -Djava.util.logging.config. file = /opt/apache-tomcat-7 .0.54 /conf/logging .properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xss512k -Xms2048M -Xmx2048M -XX:MaxPermSize=256M -XX:PermSize=128M -XX:NewSize=128M -XX:+CMSIncrementalMode -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:ParallelGCThreads=8 -Djavax.servlet.request.encoding=UTF-8 -Djavax.servlet.response.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.timezone=Asia /Shanghai  -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=10086 -Dcom.sun.management.jmxremote.ssl= false  -Dcom.sun.management.jmxremote.authenticate= false  -Djava.rmi.server. hostname =192.168.3.5 -Djava.endorsed. dirs = -Dcatalina.base= /opt/apache-tomcat-7 .0.54 -Dcatalina.home= /opt/apache-tomcat-7 .0.54 -Djava.io.tmpdir= /opt/apache-tomcat-7 .0.54 /temp  org.apache.catalina.startup.Bootstrap
tomcat   12167 12166 34 16:09 ?        00:00:05 jsvc. exec  -java-home  /opt/jdk1 .7.0_60 -user tomcat -pidfile  /opt/apache-tomcat-7 .0.54 /logs/catalina-daemon .pid -wait 10 -outfile  /opt/apache-tomcat-7 .0.54 /logs/catalina-daemon .out -errfile &1 -classpath  /opt/apache-tomcat-7 .0.54 /bin/bootstrap .jar: /opt/apache-tomcat-7 .0.54 /bin/commons-daemon .jar: /opt/apache-tomcat-7 .0.54 /bin/tomcat-juli .jar -Djava.util.logging.config. file = /opt/apache-tomcat-7 .0.54 /conf/logging .properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xss512k -Xms2048M -Xmx2048M -XX:MaxPermSize=256M -XX:PermSize=128M -XX:NewSize=128M -XX:+CMSIncrementalMode -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:ParallelGCThreads=8 -Djavax.servlet.request.encoding=UTF-8 -Djavax.servlet.response.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.timezone=Asia /Shanghai  -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=10086 -Dcom.sun.management.jmxremote.ssl= false  -Dcom.sun.management.jmxremote.authenticate= false  -Djava.rmi.server. hostname =192.168.3.5 -Djava.endorsed. dirs = -Dcatalina.base= /opt/apache-tomcat-7 .0.54 -Dcatalina.home= /opt/apache-tomcat-7 .0.54 -Djava.io.tmpdir= /opt/apache-tomcat-7 .0.54 /temp  org.apache.catalina.startup.Bootstrap
1
2
3
4
5
6
7
8
若是你的系统开起了iptables的话,这里须要开放针对jmx 和 tomcat 的端口:
vim  /etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10086 -j ACCEPT
 
 
/etc/init .d /iptables  restart
重启防火墙生效;
1
2
接下来打开浏览器测试tomcat是否已经work;
http: //192 .168.3.5:8080

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

这里咱们验证一下JMX远程监控,推荐使用VisualVM监控;

JDK中还藏着一个宝贝,它的名字叫作VisualVM。VisualVM是Sun的一个OpenJDK项目,其目的在于为Java应用建立一个整套的问题解决工具;

1
2
官网主页:
http: //visualvm .java.net/

 

步骤以下:

1)添加远程主机:

wKiom1RhsRbAoVAgAAB7hq7sWJ0335.jpg

 

2)添加jmx链接:

wKioL1RhshigJWpUAAByaipSSEU073.jpg

 

这里须要注意格式:主机+端口 ,另外下面勾选 不要求SSL链接;

wKiom1RhsgmyK9xpAADNwgknWUc141.jpg

 

3)添加完成以后打开查看tomcat 资源使用状况;

 

添加成功以后下面有个jmx的主机链接:

wKioL1RhstjBHe0GAAA_wsNwP3A861.jpg

 

打开便可!

wKiom1RhssaBcGMaAAQ0TgHyBUg489.jpg

 

So Next ,Enjoy it!

 

 

下面是一个优化后的tomcat启动脚本的范例,能够放置在/etc/init.d/下 使用, start 、 stop等进行启动 、关闭操做;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
#!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# -----------------------------------------------------------------------------
# Scripts for tomcat based on jsvc
# -----------------------------------------------------------------------------
#
# resolve links - $0 may be a softlink
export  PATH= /bin : /sbin : /usr/bin : /usr/sbin
export  JAVA_HOME= /opt/jdk1 .7.0_60
export  JRE_HOME= /opt/jdk1 .7.0_60 /jre
export  CATALINA_BASE= /opt/apache-tomcat-7 .0.54
export  CATALINA_HOME= /opt/apache-tomcat-7 .0.54
export  CATALINA_PID=$CATALINA_BASE /logs/catalina-daemon .pid
export  CATALINA_TMP=$CATALINA_BASE /temp
export  TOMCAT_USER=tomcat
export  CATALINA_OPTS= "-server -Xss512k -Xms2048M -Xmx2048M -XX:MaxPermSize=256M -XX:PermSize=128M -XX:NewSize=128M -XX:+CMSIncrementalMode -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:ParallelGCThreads=8 -Djavax.servlet.request.encoding=UTF-8 -Djavax.servlet.response.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=22222 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.3.5"
ARG0= "$0"
while  [ -h  "$ARG0"  ];  do
   ls =` ls  -ld  "$ARG0" `
   link=` expr  "$ls"  '.*-> \(.*\)$' `
   if  expr  "$link"  '/.*'  /dev/null then
     ARG0= "$link"
   else
     ARG0= "`dirname $ARG0`/$link"
   fi
done
DIRNAME= "`dirname $ARG0`"
PROGRAM= "`basename $ARG0`"
while  ".$1"  != . ]
do
   case  "$1"  in
     --java-home )
         JAVA_HOME= "$2"
         shift shift ;
         continue
     ;;
     --catalina-home )
         CATALINA_HOME= "$2"
         shift shift ;
         continue
     ;;
     --catalina-base )
         CATALINA_BASE= "$2"
         shift shift ;
         continue
     ;;
     --catalina-pid )
         CATALINA_PID= "$2"
         shift shift ;
         continue
     ;;
     --tomcat-user )
         TOMCAT_USER= "$2"
         shift shift ;
         continue
     ;;
     * )
         break
     ;;
   esac
done
# OS specific support (must be 'true' or 'false').
cygwin= false ;
darwin= false ;
case  "`uname`"  in
     CYGWIN*)
         cygwin= true
         ;;
     Darwin*)
         darwin= true
         ;;
esac
# Use the maximum available, or set MAX_FD != -1 to use that
test  ".$MAX_FD"  = . && MAX_FD= "maximum"
# Setup parameters for running the jsvc
#
test  ".$TOMCAT_USER"  = . && TOMCAT_USER=tomcat
# Set JAVA_HOME to working JDK or JRE
# JAVA_HOME=/opt/jdk-1.6.0.22
# If not set we'll try to guess the JAVA_HOME
# from java binary if on the PATH
#
if  [ -z  "$JAVA_HOME"  ];  then
     JAVA_BIN= "`which java 2>/dev/null || type java 2>&1`"
     test  -x  "$JAVA_BIN"  && JAVA_HOME= "`dirname $JAVA_BIN`"
     test  ".$JAVA_HOME"  != . && JAVA_HOME=` cd  "$JAVA_HOME/.."  > /dev/null pwd `
else
     JAVA_BIN= "$JAVA_HOME/bin/java"
fi
# Only set CATALINA_HOME if not already set
test  ".$CATALINA_HOME"  = . && CATALINA_HOME=` cd  "$DIRNAME/.."  > /dev/null pwd `
test  ".$CATALINA_BASE"  = . && CATALINA_BASE= "$CATALINA_HOME"
test  ".$CATALINA_MAIN"  = . && CATALINA_MAIN=org.apache.catalina.startup.Bootstrap
# If not explicitly set, look for jsvc in CATALINA_BASE first then CATALINA_HOME
if  [ -z $JSVC ];  then
     JSVC= "$CATALINA_BASE/bin/jsvc"
     if  [ ! -x $JSVC ];  then
         JSVC= "$CATALINA_HOME/bin/jsvc"
     fi
fi
# Set the default service-start wait time if necessary
test  ".$SERVICE_START_WAIT_TIME"  = . && SERVICE_START_WAIT_TIME=10
# Ensure that any user defined CLASSPATH variables are not used on startup,
# but allow them to be specified in setenv.sh, in rare case when it is needed.
CLASSPATH=
JAVA_OPTS=
if  [ -r  "$CATALINA_BASE/bin/setenv.sh"  ];  then
   "$CATALINA_BASE/bin/setenv.sh"
elif  [ -r  "$CATALINA_HOME/bin/setenv.sh"  ];  then
   "$CATALINA_HOME/bin/setenv.sh"
fi
# Add on extra jar files to CLASSPATH
test  ".$CLASSPATH"  != . && CLASSPATH= "${CLASSPATH}:"
CLASSPATH= "$CLASSPATH$CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/commons-daemon.jar"
test  ".$CATALINA_OUT"  = . && CATALINA_OUT= "$CATALINA_BASE/logs/catalina-daemon.out"
test  ".$CATALINA_TMP"  = . && CATALINA_TMP= "$CATALINA_BASE/temp"
# Add tomcat-juli.jar to classpath
# tomcat-juli.jar can be over-ridden per instance
if  [ -r  "$CATALINA_BASE/bin/tomcat-juli.jar"  ] ;  then
   CLASSPATH= "$CLASSPATH:$CATALINA_BASE/bin/tomcat-juli.jar"
else
   CLASSPATH= "$CLASSPATH:$CATALINA_HOME/bin/tomcat-juli.jar"
fi
# Set juli LogManager config file if it is present and an override has not been issued
if  [ -z  "$LOGGING_CONFIG"  ];  then
   if  [ -r  "$CATALINA_BASE/conf/logging.properties"  ];  then
     LOGGING_CONFIG= "-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
   else
     # Bugzilla 45585
     LOGGING_CONFIG= "-Dnop"
   fi
fi
test  ".$LOGGING_MANAGER"  = . && LOGGING_MANAGER= "-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
JAVA_OPTS= "$JAVA_OPTS $LOGGING_MANAGER"
# Set -pidfile
test  ".$CATALINA_PID"  = . && CATALINA_PID= "$CATALINA_BASE/logs/catalina-daemon.pid"
# Increase the maximum file descriptors if we can
if  "$cygwin"  "false"  ];  then
     MAX_FD_LIMIT=` ulimit  -H -n`
     if  "$?"  - eq  0 ];  then
         # Darwin does not allow RLIMIT_INFINITY on file soft limit
         if  "$darwin"  "true"  -a  "$MAX_FD_LIMIT"  "unlimited"  ];  then
             MAX_FD_LIMIT=` /usr/sbin/sysctl  -n kern.maxfilesperproc`
         fi
         test  ".$MAX_FD"  ".maximum"  && MAX_FD= "$MAX_FD_LIMIT"
         ulimit  -n $MAX_FD
         if  "$?"  - ne  0 ];  then
             echo  "$PROGRAM: Could not set maximum file descriptor limit: $MAX_FD"
         fi
     else
         echo  "$PROGRAM: Could not query system maximum file descriptor limit: $MAX_FD_LIMIT"
     fi
fi
# ----- Execute The Requested Command -----------------------------------------
case  "$1"  in
     run     )
       shift
       "$JSVC"  $* \
       $JSVC_OPTS \
       -java-home  "$JAVA_HOME"  \
       -pidfile  "$CATALINA_PID"  \
       -wait 10 \
       -nodetach \
       -outfile  "&1"  \
       -errfile  "&2"  \
       -classpath  "$CLASSPATH"  \
       "$LOGGING_CONFIG"  $JAVA_OPTS $CATALINA_OPTS \
       -Djava.endorsed. dirs = "$JAVA_ENDORSED_DIRS"  \
       -Dcatalina.base= "$CATALINA_BASE"  \
       -Dcatalina.home= "$CATALINA_HOME"  \
       -Djava.io.tmpdir= "$CATALINA_TMP"  \
       $CATALINA_MAIN
       exit  $?
     ;;
     start   )
       "$JSVC"  $JSVC_OPTS \
       -java-home  "$JAVA_HOME"  \
       -user $TOMCAT_USER \
       -pidfile  "$CATALINA_PID"  \
       -wait 10 \
       -outfile  "$CATALINA_OUT"  \
       -errfile  "&1"  \
       -classpath  "$CLASSPATH"  \
       "$LOGGING_CONFIG"  $JAVA_OPTS $CATALINA_OPTS \
       -Djava.endorsed. dirs = "$JAVA_ENDORSED_DIRS"  \
       -Dcatalina.base= "$CATALINA_BASE"  \
       -Dcatalina.home= "$CATALINA_HOME"  \
       -Djava.io.tmpdir= "$CATALINA_TMP"  \
       $CATALINA_MAIN
       exit  $?
     ;;
     stop    )
       "$JSVC"  $JSVC_OPTS \
       -stop \
       -pidfile  "$CATALINA_PID"  \
       -classpath  "$CLASSPATH"  \
       -Djava.endorsed. dirs = "$JAVA_ENDORSED_DIRS"  \
       -Dcatalina.base= "$CATALINA_BASE"  \
       -Dcatalina.home= "$CATALINA_HOME"  \
       -Djava.io.tmpdir= "$CATALINA_TMP"  \
       $CATALINA_MAIN
       exit  $?
     ;;
     version  )
       "$JSVC"  \
       -java-home  "$JAVA_HOME"  \
       -pidfile  "$CATALINA_PID"  \
       -classpath  "$CLASSPATH"  \
       -errfile  "&2"  \
       -version \
       -check \
       $CATALINA_MAIN
       if  "$?"  = 0 ];  then
         "$JAVA_BIN"  \
         -classpath  "$CATALINA_HOME/lib/catalina.jar"  \
         org.apache.catalina.util.ServerInfo
       fi
       exit  $?
     ;;
     *       )
       echo  "Unknown command: \`$1'"
       echo  "Usage: $PROGRAM ( commands ... )"
       echo  "commands:"
       echo  "  run               Start Tomcat without detaching from console"
       echo  "  start             Start Tomcat"
       echo  "  stop              Stop Tomcat"
       echo  "  version           What version of commons daemon and Tomcat"
       echo  "                    are you running?"
       exit  1
     ;;
esac

 

 

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

1
2
3
4
5
参考资料:
http: //tomcat .apache.org /tomcat-7 .0-doc /setup .html #Unix_daemon
http: //tomcat .apache.org /tomcat-7 .0-doc /RUNNING .txt
https: //svn .apache.org /repos/asf/tomcat/tc7 .0.x /trunk/bin/daemon .sh
http: //ifeve .com /useful-jvm-flags-part-7-cms-collector/

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

相关文章
相关标签/搜索