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:在控制面板上的重启按钮
枱査日志文件以查看启动产生的问题!