设置tomcat自动启动

来源:互联网 发布:软件开发教学 编辑:程序博客网 时间:2024/04/30 06:24

         Tomcat 默认情况下,不管在Windows还是Linux下,都不是作为服务来启动的。本文通过总结在Windows 和 Linux下,把Tomcat改造成服务(守护)进程的方法。
         以下均以Tomcat 6 为前提。
        主要来源:

         http://light6891.blog.163.com/blog/static/9696290920101036655926/
         http://blog.csdn.net/scs2000/article/details/1935397
         http://alohawu.blog.51cto.com/3208572/586403


         一   Windows 下 Tomcat 服务进程改造
        

安装好tomcat6后,在bin目录有这三个文件 tomcat6w.exe /tomcat6.exe / startup.bat 他们都与启动tomcat有关。

 

tomcat6.exe这个文件是用来启动tomcat ,双击它出现个DOS样子的窗口一闪而过消失了,tomcat也没有启动成功。双击tomcat6w.exe弹出个错误对话框,说指定的服务并未以安装的服务存在。Unable to open the service tomcat6”。其实这两个文件要起作用,必须先为这个tomcat开通服务。

 

tomcat开通服务:

1编辑service.bat文件。

rem Guess CATALINA_HOME if notdefined
set CURRENT_DIR=%cd%

添加下面一句指定tomcat的安装目录(%TOMCAT_PATH%为tomcat安装的绝对路径)。
     set CATALINA_HOME=%TOMCAT_PATH%
     if not "%CATALINA_HOME%" == ""goto gotHome
     set CATALINA_HOME=%cd%

为了在“进程”中跟其他安装的tomcat区分名字,修改tomcat6.exe 的文件名。这里假设修改成tomcat6018.exe。

if exist"%CATALINA_HOME%\bin\tomcat6018.exe" goto okHome
rem CD to the upper dir
cd ..
set CATALINA_HOME=%cd%
:gotHome
if exist "%CATALINA_HOME%\bin\
tomcat6018.exe" goto okHome
echo The tomcat.exe was not found...
echo The CATALINA_HOME environment variable is not defined correctly.
echo This environment variable is needed to run this program
goto end
rem Make sure prerequisite environment variables are set
if not "%JAVA_HOME%" == "" goto okHome
echo The JAVA_HOME environment variable is not defined
echo This environment variable is needed to run this program
goto end
:okHome
if not "%CATALINA_BASE%" == "" goto gotBase
set CATALINA_BASE=%CATALINA_HOME%
:gotBase
 
set EXECUTABLE=%CATALINA_HOME%\bin\
tomcat6018.exe

rem Set default Service name

创建服务后的服务名称,这个名称必须唯一。
set SERVICE_NAME=
Tomcat6018

创建服务后的服务显示名称,这个名称可以与其他服务显示名称相同。
set PR_DISPLAYNAME=Apache Tomcat 6018

 

............ (中间省略)

 

"%EXECUTABLE%"//US//%SERVICE_NAME% ++JvmOptions "-Djava.io.tmpdir=%CATALINA_BASE%\temp;-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager;-Djava.util.logging.config.file=%CATALINA_BASE%\conf\logging.properties"--JvmMs 128 --JvmMx 256

如果你需要把服务设置为开机自启动,可以加上下面这句(位置为文件倒数第三行前面)

sc config %SERVICE_NAME% start=auto
echo The service'%SERVICE_NAME%' has been installed.

:end
cd %CURRENT_DIR%

保存文件。

 

运行"cmd"命令,进入DOS界面bin目录下service.bat文件执行install命令,若出现以下界面说明服务安装成功。

   运行"services.msc"命令打开服务窗口,发现的确多了一个"Apache Tomcat 6018"的服务,右键查看它的属性,服务名称与显示名称都与之前在service.bat文件的设置一致。

然后,修改tomcat6w.exe的文件名,文件名必须和服务名称一样,如果服务名称与服务执行文件的名称一样,可以改名为服务名称后加"w"。像本例,服务执行文件是tomcat6018.exe,服务名称是Tomcat6018,为了防止出现文件重名冲突因此无法将tomcat6w.exe改名为Tomcat6018.exe,只能改名为tomcat6018w.exe

现在,可以通过启动这个服务来启动tomcat,双击tomcat6018w.exe打开的界面也可以启动这个服务,启动这个服务实际上就是启动tomcat6018.exe。如果不想用服务方式启动tomcat,可以双击tomcat6018.exestartup.bat启动。



    二 Linux Tomcat 服务进程改造
   

catalina.sh是Tomcat 启动和关闭的关键脚本,start.sh和shutdown.sh只是做了一些路径的判断,顺便带个参数过去,具体的开启和关闭是由catalina.sh来实现,故可以考虑把catalina.sh进行改造,然后设置成为系统服务即可。
        

1.首先需要用root用户将$Tomcat_HOME/bin目录下的catalina.sh脚本复制到目录/etc/init.d中,重命名为tomcat4000,文件名即为以后的服务名,并查看该文件有无执行权限,如果没有,增加执行权限;

2.修改刚才复制的tomcat4000脚本:

   a. 在脚本的开头插入下面两行(如果不需要启动时自动运行,则无需添加)

    #chkconfig: 2345 10 90

    # description:Tomcat4000 service

  第一行是服务的配置:第一个数字是服务的运行级,2345表明这个服务的运行级是2、3、4和5级(Linux的运行级为0到6);第二个数字是启动优先级,数值从0到99;第三个数是停止优先级,数值也是从0到99。(运行级介绍见附录4.2)

   第二行是对服务的描述

 

    b. 在脚本中设置CATALINA_HOME 和 JAVA_HOME 这两个脚本必需的环境变量这两个脚本必需的环境变量,如:

port="4000"

export CATALINA_HOME=/prog/tomcat/$port

export JAVA_HOME=/prog/jdk1.6.0_22

3.现在就可以用service tomcat start|stop来管理tomcat服务了

4.如果要让服务自动运行,还得将服务添加到系统中去

  切换为root用户,终端运行下列命令,将tomcat服务添加到系统服务中:
        chkconfig --add tomcat4000
       (注意:
     在tomcat文件的头两行的注释语句中,需要包含chkconfig和description两部分内容(确认不要拼写错误,),否则在执行“chkconfig --add tomcat”时,会出现“tomcat服务不支持chkconfig”的错误提示。
    chkconfig这行表示缺省启动的运行级别以及启动和停止的优先级,如该服务缺省不再任何运行级启动,则以 - 代替运行级别。在tomcat中表示脚本在运行级2、3、4、5启动,启动优先权为10,停止优先权为90。
    description行对服务进行描述,可以用 “\” 跨行注释。)

 可以使用setup命令查看系统服务(默认情况下,经过上述命令,已选择开机自动启动,如需取消,则可通过该命令,撤销)


catalina.sh本身支持强制关闭tomcat,但需要一个变量CATALINA_PID,也就是tomcat的进程号,只要我们指定了CATALINA_PID,tomcat启动时就会将进程号写入指定的文件中,所以我们可以在CATALINA_HOME 和 JAVA_HOME后面加上下面的语句:
export CATALINA_HOME=/prog/tomcat/$port
export JAVA_HOME=/prog/jdk1.6.0_22

exportCATALINA_PID=/prog/tomcat/$port/conf/catalina.pid

这样我们关闭tomcat时,就可以使用service tomcat stop –force进行强制关闭,还可以使用service tomcat stop 30 –force设置强制关闭等待时间,单位为秒,默认5秒。

注意事项:

       一旦指定CATALINA_PID,会对tomcat启停造成较大影响,启动时,脚本会检查该文件是否存在,若存在,则说明上次停止应用未成功,脚本报错,终止启动过程。停止时,脚本会检查该文件是否存在,若不存在,脚本报错,终止停止过程;若存在,而脚本找不到文件中的进程号,脚本报错,终止停止过程。所以只要所有的启停都通过service命令来操作,则不会有问题,若直接调用tomcat\bin目录下的脚本进行启停,或者系统异常关闭,导致CATALINA_PID未能正常删除,则会对调用service造成影响,需要手动进行CATALINA_PID文件的删除等操作。必要时,可考虑修改脚本绕过一些判断。



经过上述改造后,命令集如下:
     停服务 service tomcat4000 stop等同于调用tomcat本身的shutdown.sh,不会强制杀进程来停止应用
              -force服务未停止时杀进程,默认等待时间为5秒,可通过修改服务脚本中的“SLEEP=5”,修改默认等待时间
            30 -force“整数n“+“-force”, 服务未停止时杀进程,等待时间为n秒
     启服务 service tomcat4000 start等同于调用tomcat本身的starup.sh 


    后记: 
             改造Tomcat作为服务进程 ,主要是为了UAT环境/生产环境执行命令方便,不需切换目录;
            在实际项目中,是和Hudson打包发布结合使用的;在测试中发现,tomcat进程停掉后,要等一会,通讯端口才能完全释放;即TIME_WAIT状态还需要等2MSL()后才能返回到CLOSED状态,如在TIME_WAIT状态就启动tomcat,则无法建立Listen端口,在实际中,我采用了Sleep(60)后,在启动tomcat方法。