Tomcat教程

Tomcat的启动,停止与重启

安装结束后,您可能急着要启动Totncal来看看它是否能运行。本节会详细说明在每一种 支持的操作系统上启动及停止Tomcat的特定信息。同时也会仔细讲解您可能碰到的一些常见错误,从而使您能迅速地找出及解决所碰到的问题。

启动与停止

正确启动和停止Tomcat的方法有赖子您是如何安装例如,如果您从Linux RPM包下安装Tomcah那么该包包含的init脚本ini动和停止Tomcat。或者,如果您 从tomcat.apache.org通过Windows上的围形化安装工具安装了Tomcat,那么您该JT1 Windows服务予以启动和停止Tomcat。有关这些包制定的详细情况将在随后几节中予以 说明。如果您采用了常规安装方式,即从Tomcai下载页上下载/一进制发行版归档文件(.zip或tar.gz)安装的Tomcat,那么您应使用CATALINA_HOME/bin录下保存的命令行脚本来完成这一任务。

Bin目录下存在用于启动和停止Tomcat的许多脚本。在Unix下,所有需要直接调用的脚 本均以shell脚本文件(.sh)的形式提供,而在Windows下则是以批处理文件(如、的 形式提供。表列出了这些脚本并对其进行了描述。在引用这些脚本时,笔者省略了文件扩展名,因为catalina.bat对Microsoft Windows用户来说,其意义与Unix用户下的 catalina.sk (注3)相同。因此,表中的名宇只以catalinad的简单方式出现。您可由此推 断系统所对应的文件扩展名。

表执行Tomcat的脚本

脚本 用途
Catalina Tomcat的主要脚本,它会执行java命令以调用Tomcat的启动与停止类
cpappend 用干Windows系统内部,会将顿目(路径)追加至Tomcat的classpath环校 变量中
digest 生成Tomcat密码的加密摘要值用于产生加密过的密码
service 该脚本以Windows服务的方式安装和卸载Tomcat
setclasspath 这也是唯一用于系统内部,以设定Tomcat的dasspath及许多其他环境变1:的 脚本
shutdown 运行catalina stop以停止Tomcat运行
startup 运行catalina stop以启动Tomcat运行
tool-wrapper 用于digest脚本系统内部。这是最常用的Tomcat命令行工具,用于封装可用于设置环境变量的脚本,并调用Classpath中设置的完仝符合限定的主要方法
version 这是运行catalina的版本,会输出Tomcat的版本信息

执行catalifia时,必须附带一个参数:摄常用的是start, run及stop。当以start调 用catalina (与调用startup一样)时,它会启动Tomcat,并将板准输出与错误流导出到 $TOMCAT_HOME/logs/catalina.out文件中。参数run会让Tomcat保留当前的标准输出与 错误流(如控制台窗口)当您从终端机执行并想看到启动时的输出时,这会有帮助。 这个输出信息与示例1-1所示的类似。

示例1-1 :执行catalina run的输出信息。

iar:389$ bin/catalina.sh start
Using CATALIWA_BASE:   /howe/ian/apacht~tomcat-6.0.14 
Using CATALINAHOME:    /home/ian/apache-tomcat-6.0.14 
Using CATALIWA THPDIR: /home/ian/apache-tomcat-6.0-14/temp 
Using JRE_HOME:        /usr/java/jdk1.6.0_02
Sep 27, 2007 10:42:16 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent 
INFO: The Apache Tomcat Native library which allows optimal performance in produ ction 
environments not found on the java.library.path; /usr/java/jdk1.5.0_06/bin/.../jre/bin: 
/usr/lib
Sep 17, 2007 10:42:17 PM org.apache.coyote. httpil,HttpilBaseProtocol init 
INFO: Initializing Coyote HTTP/1.1 on http-8080 
Sep 27, Z007 10:42:17 PM org.apache.catalina.startup.Catalina load 
INFO: Initialization processed in 948 ms
Sep 27, 2007 10:42:17 PM org.apache.catalina-Core.StandardService start 
INFO: StaTting service Catalina
Sep 27, 2007 10:42:17 PM org.apache.catalina.core.StandardEngine start 
INFO: Starting Servlet Engine: Apache Tomcat/6.0.14 
Sep 27, 2007 10:42:17 PM org.apachetcatalina.core.StandardHost start 
INFO: XHL validation disabled
Sep 27, 2007 10:42:27 PM org.apache,coyote.httpll.HttpllBaseProtocol start 
INFO: Starting Coyote HTTP/1.1 on http-SoSo
Sep 27, 2007 10:42:28 PM org.apachecommon.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
Sep 27, 2007 10:42:29 PM org. apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/106 config=null
INFO: Find registry server-registry.xml at classpath resource
Sep 27, 2007 10:42;30 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 1109 ms

如果使用Catalina及start选项,或调用startup脚本而非使用参数run,那么您会在控 制台上看到前儿行Using…;其余的输出信息则被重定向到Catalina.out的日志文件中。shutdown脚本会调用stop参数的它会让Tomcat连接下Server元素(dement)中 设定的默认端口,并送出停止信息。启动选项的完整清单则列于表 1-2中。

表1-2: catalina脚本的启动参数

脚本 用途
-config [ server.xml file] 指定另一个server.xml配置文件n默认是使用驻留在$CATALINA_ BASE/conf目录中的server.xml文件。
-help 输出命令行选项的摘要表
-nonaming 在 Tomcat 中停用 JNDI
-security 启用catalina.policy文件
debug 以调试模式启动Tomcat
embedded 在嵌人模式中测试Tomcat应用程序服务器的开发者通常使用此选项
jpda start Java Platform Debugger Architecture的调试器方式启动Tomcat
run 启动Tomcat,但不会重定向标准输出与结误
start 启动Tomcat,并将标推输出与错误送至Tomcat的日志文件
stop 停止 Tomcat
version 输出Tomcat的版本信息

环境变量

为了防止失控的程序损害操作系统,Java运行时环境具备如"最大堆栈大小"的限制条件。设立这些限制条件的时代背景是内存还十分昂贵的年代,例如,对JDK1.3,默认限 制只有32MB。不过,Java命令的选项可以让您控制这些限制值,真正的格式则视Java运 行时环境而定,不过,如果使用标准的Sun运行时环境,则可以输入:

java -Xmx-256M MyProg

这会执行称为MyProg的类文件,并给整个Java运行时进程分紀最大256MB的内存。

当使用Tomcat时,这些选项就变得尤为重要,因为执行servlet可能会在Java环境中占据 许多内存。如欲将这个或其他选项传给启动Tomcat的Java命令,则在执行Tomcat的启动 脚本之前,可以在环境变量JAVA_OPTS中设定选项。

Windows用户应该从控制面板中设定这个环境变而Unix用户则应该直接在shell提示下或登录脚本中设立:

$ export   JAVA OPTS="-Xmx256M"   # Korn and Bourne shell 
C:\>set   JAVA OPTS="-Xmx256M"   # MS-DOS
$ setenv   JAVA OPTS "-Xmx256M"   # C-shell

其他可以设定的Tomcat环境变量如表1-3所示

表1-3: Tomcat的环境变量

选项 用途 默认值
CATALINA_BASE 设定Tomcat安装树定制或可写部分的基本目录, 如logging文件、work目录、Tomcat的conf目录及 webapp目录。是CATALINA_HOME的别名 Tomcat安装目录
CATALINA_HOME 此为Tomcat諍态(只读)部分的基本目录,如Tomcat库文件和命令行脚本 Tomcat安装目录
CATALINA_OPTS 将Tomcat指定命令行选项传给Java命令
CATALINA_TMPDIR 设定存放Tomcat临时文件的目录 CATALINA_HOME/temp
JAVA_HOME 设定Tomcat将要用的Java运行时或JDK环境的位置
JRE HOME JAVA_HOME的别名
JAVA_OPTS 可以设置Java命令行选项的地方
JPDA_TRANSPORT 设置JPDA调试器使用的透明传输协议 dt_socket
JPDA_ADDRESS 设定与catalina jpda start命令一起使用的JPDA地址 8000
JSSE_HOME 设定用于HTTPS使用的Java Secure SocketsExten sion的位置
CATALINA_PID 可以存储在Tomcat启动和停止时要使用的进程ID对应的路径

启动与停止:综述

如果巳通过Apache二进制发行版目标文件(zip文件或.tar.gz文件)安装了Tomcat,请您 切换目录到已安装Tomcat的目录下:

$ cd apache-tomcat-6.0.14

以命令打印出(echo) $JAVA_HOME环境变量,并确认它已被设定成要让Tomcat使用的 Java安装目录的绝对路径,如果不是,请現在设定并将它导出。如果Java解释器并末在$PATH上也可以,因为Tomcat的脚本可以依据$JAVA_HOME的设定值找到Java并使用它。

然后确定您并未在8080端口(Tomcat HTTP服务器的默认端H)或8005 (Tomcat停止服 务器的默认端 口)运行TCP服务器。尝试运行telnet locathost 8080 及telnet localhost 8005 以检査核实是否有任何现成的服务器接受联机。

以startup.sh脚本來启动Tomcat,如下所示:

$ bln/startup,£h
Using CATALINA_BASE:  /home/jasonb/apache-tomcat-6.0.14 
Using CATALIWAhOME:    /howe/jasonh/apache-tomcat-6.0.14 
Using CATALINATHPDIR:  /home/jasonb/apache-tomcat-6.0.14/temp 
Using JAVA_H0ME:       /usr/java/jdk1.6.0_02

Tomcat启动时,您应该会看到类似这样的输出问题。一旦启动后,它就应该能在 8080端口上提供网页服务(如果服务器是locathost,尝试在网页浏览器中输人 http://localhost:8080)

可以通过执行shutdown.sh脚本来停止Tomcat:

$ bin/shutdown.sh
Using CATALINA BASE:     /liosne/jasorb/apache-tomcat-6.0.14
Using CATALIMAH0ME:      /home/jaionb/apache-tomcat-6.0.14
Using CATALINATMPDIR:    /home/jasonb/apache-tomcat-6.0.14/temp
Using JAVA_H0KE:         /usr/java/jdk1.6.0_02

在Linux与Solaris上启动与停止Tomcat

如果您已经通过Linux上的RPM包安装了Tomcat,则您可以通过Tomcat的init脚本执行 start命令予以测试:

#/etc/rc.d/init.d/tomcat start
Starting tomcat:                            [ OK ]

或者在如TFedora和Red Hat这样的Linux操作系统上,您可以录人下列简短的命令予以替 代

#service tomcat start

如果您安装了JPackage.org Tomcat RPM包,则init脚本名是tomcat55,因此相应的命令应垓 是:

#/etc/rc.d/init.d/tomcat55 start

然后,检査一下Tomcat足否已运行:

#ps auwutx | grep catalina.startup.Bootstrap

您应能看到许多Java进程在滚动,检查Tomcat是否在运行的另一种方法是从服务器的8080端口上奄看网页响应。

要停止Tomcat运行,请执行下列stop命今:

#/etc/re.d/init.d/tomcat stop

或者(更短):

#service tomcat stop

在FreeBSD上启动与停止Tomcat

该部分将Tomcat安装到根路径usr/local/tomcat6.0/下。Tomcat的该行为可以通过/etc/rc.conf文件中的变量进行配置,以覆盖文件中包含的设置信息。该 部分包含了叫做${PREFIX}etc/rc.d/tomcat6.0.sh的RCng脚本。在默认情况下,该文件以usr/local/etc/rc.d/tomcat60.sh结尾。阁读该文件的上部,以了解/etc/rc.conf件中应用的 Tomcat变量设置信息。

按以下方式启动Tomcat :

#/usr/local/etc/rc.d/tomcat60.sh start 
Starting tomcat60.

该命令只有在您将下列行添加到了/etc/rc.d文件中才会运行

tomcat60_enable="YES"

您可以使用tomcat60.sh启动,停止和重启Tomcat6了。

Tomcat 6.0的这一FreeBSD端U默认将Tomcat的默认HTTP端口号设置为8180,这与在 Apache软件基金会的Tomcat端口初始化默认值不同(对所有操作系统而言,该端口是 8080},通过URL为http://locathost:8180/的地址尝试访问FreeBSD Tomcat端口。


常见错误

当您试图启动Tomcat时,您可能会犯一些常见错误。虽然您会遇到很多错误,但这些错 误却是笔者最常碰到的。

Another server is running on port 80 or 8080 (另一个服务器在8或8080端 口上运行) 确定Tomcat还没有运行。如果没有,则袷査是否有其他程序(如另一个Java应用程 序服务器成Apache web服务器)正在这些端口上运行。

Another instance of Tomcat is running (另一个 Tomcat 的实例在运行) 请记住,不同的Tomcat实例(JVM)必须使用不同的HTTP端口,而且在server.xml文件中,server及Connector元素中的每一个端口号也必须不同。


重启Tomcat

截止本书发稿时,笔者尚末出现Tomcat 6发行版中含有重启动的脚本。这是因为在 Tomcat停止时,编写确认重启前是杏关闭正常的脚本是相当困难的。下面列出的Tomcat 不可靠关闭(unreliable shutdown)的理由几乎都是特殊情况,这表示它们通常都不会发 生,只在不寻常的情况K才可能会发生。以下是Tomcat小可靠关闭的一些原因:

Java Servlet Specification并没有强制规定Java servlet需要花多长时间完成其工作。 编写需要永远执行其工作的servlet并没有违反Java Servlet Specification的规定,不 过却能阻止Tomcat关闭。

Java Servlet Specification还要求,在关闭Tomcat时,servlet container必须在servlet 服务结束前等待每个servlet完成所有还在进行的请求,或在servlet服务结束前等待 容器指定的超时时限。对TomCat6,该超时时限是给每个servlet最多等待半秒钟, 当servlet出错完成服务请求耗时过长时,则由Tomcat来断定servlet已耗时太久,并强制结束服务,关闭Tomcat。不过,这个过程需耍时间,因此会減慢Tomcat自身 的关闭过程。

Java虚拟机器中的多线程是以特定方式处理的,它意味着Java程序代码不会一直 精确地计算实际时长(Java SE并不是实时程序开发环境。同时,由于该方式下 Java线程是由CPU预定的,所以会引起线程阻塞和滞留阻塞。由于这些限制,在执 行shutdown.sh时所调用的程序代码将永远无法知道Tomcat要等待多久才会停止, 而Tomcat也永远无法知道它已经在关闭上耗时太久。这表示当以纯Java编写时, Tomcat关闭过程不是完全可靠的。要想可靠关闭Tomcat需要用其他编程语言编写 外挂程序。

因为Tomcat足一种可嵌入式的servlet container,所以在关闭服务器时,它尽可能不调用System.exit(0),因为它不知道还需要执行哪些进程,所以才会在相同的Java 虚拟机器中继续运行。相反,如果不需要执行艽他进程,Tomcat会关闭其所有线 程,从而VM可以方便地退出。因此,在Tomcat所有的线程都停止时,servlet还会 衍生出阻止VM退出的线程。

只要安全管理器允许,Java Servlet Specification允许servlet创建执行工作的额外Java线程(注4)。一旦servlet衍生了另一个线程,则它提升自己的优先权,并超过 Tomcat线程的优先权(如果安全管理器许可),而这会阻止Tomcat关闭或运行。通 常这是因错误程序代码而导致的,并不是恶意的程序代码。请勿这样处理!

如果Tomcat完全内存溢出(日志中以可怕的“Permgen memory 迹象予以表现),那么在其关闭端口或web端口上就无法接受新的连接了。

重启Tomcat Windows服务

如果您把Tomcat当成Windows服务来运行,那您就可从控制面板中重启它。在对应服 务上右键单击鼠标并从弹出式菜单上选择“重启”;如果您的Windows版本上已存在 Tomcat,则您可以使用对话框右上角附近的“重启"按钮来完成这一工作(如图1-6所 示)。

图1.6:在控制面板上的重启按钮

枱査日志文件以查看启动产生的问题!

关注微信获取最新动态