在linux下如果想让tomcat在开机时自启动,可以将启动代码写到/etc/rc.local里面。但是,这样的话,tomcat将以root权限运行,这是不安全的。因此,要想办法让tomcat以非特权身份作为daemon运行。

要将tomcat作为linux的daemon运行,需要commons-daemon工程的jsvc工具,tomcat的bin目录里已经自带了这个工具的源码。

解压commons-daemon-native.tar.gz,进入unix子目录,然后configure。configure的时候需要指定jdk路径或者当前环境中有JAVA_HOME变量。

接下来在make的时候可能会出现如下错误:

 

[php]  view plain copy
  1. ar: libservice.a: Malformed archive  
  2. make[1]: *** [libservice.a] Error 1  

这是一个已知的bug:

[php]  view plain copy
  1. The file bin/commons-daemon-native.tar.gz contains dirty (already compiled)  
  2. code. On some systems this causes "make" to return the following error:  
  3. ar: libservice.a: Malformed archive  
  4. The solution is to run "make clean" before running "make".  
  5. I believe that "make clean" should be run before creating the tgz file, so that  
  6. there are no compiled/generated files laying around.  

make以后得到jsvc文件,复制到tomcat的bin目录中。另外在native目录下有一个Tomcat5.sh,是用于tomcat自启动的一个模板,我们可以修改它快速得到一个符合要求的启动文件。在这里,我将它修改为如下内容:

[php]  view plain copy
  1. #!/bin/sh  
  2. ##############################################################################  
  3. #  
  4. # Licensed to the Apache Software Foundation (ASF) under one or more  
  5. # contributor license agreements.  See the NOTICE file distributed with  
  6. # this work for additional information regarding copyright ownership.  
  7. # The ASF licenses this file to You under the Apache License, Version 2.0  
  8. # (the "License"); you may not use this file except in compliance with  
  9. # the License.  You may obtain a copy of the License at  
  10. #  
  11. #     http://www.apache.org/licenses/LICENSE-2.0  
  12. #  
  13. # Unless required by applicable law or agreed to in writing, software  
  14. # distributed under the License is distributed on an "AS IS" BASIS,  
  15. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
  16. # See the License for the specific language governing permissions and  
  17. # limitations under the License.  
  18. ##############################################################################  
  19. #  
  20. # Small shell script to show how to start/stop Tomcat using jsvc  
  21. # If you want to have Tomcat running on port 80 please modify the server.xml  
  22. # file:  
  23. #  
  24. #    <!-- Define a non-SSL HTTP/1.1 Connector on port 80 -->  
  25. #    <Connector className="org.apache.catalina.connector.http.HttpConnector"  
  26. #               port="80" minProcessors="5" maxProcessors="75"  
  27. #               enableLookups="true" redirectPort="8443"  
  28. #               acceptCount="10" debug="0" connectionTimeout="60000"/>  
  29. #  
  30. # That is for Tomcat-5.0.x (Apache Tomcat/5.0)  
  31. #  
  32. # Adapt the following lines to your configuration  
  33. JAVA_HOME=/usr/local/sun-java6-jdk  
  34. CATALINA_HOME=/usr/local/apache-tomcat-6  
  35. DAEMON_HOME=$CATALINA_HOME  
  36. TOMCAT_USER=tomcat6  
  37.   
  38. for multi instances adapt those lines.  
  39. TMP_DIR=/var/tmp  
  40. PID_FILE=/var/run/jsvc.pid  
  41. CATALINA_BASE=$CATALINA_HOME  
  42.   
  43. #CATALINA_OPTS="-Djava.library.path=/home/jfclere/jakarta-tomcat-connectors/jni/native/.libs"  
  44. CLASSPATH=/  
  45. $JAVA_HOME/lib/tools.jar:/  
  46. $CATALINA_HOME/bin/commons-daemon.jar:/  
  47. $CATALINA_HOME/bin/bootstrap.jar  
  48.   
  49. case "$1" in  
  50.   start)  
  51.     #  
  52.     # Start Tomcat  
  53.     #  
  54.     echo "Starting tomcat6..."  
  55.     $DAEMON_HOME/bin/jsvc /  
  56.     -user $TOMCAT_USER /  
  57.     -home $JAVA_HOME /  
  58.     -Dcatalina.home=$CATALINA_HOME /  
  59.     -Dcatalina.base=$CATALINA_BASE /  
  60.     -Djava.io.tmpdir=$TMP_DIR /  
  61.     -wait 10 /  
  62.     -pidfile $PID_FILE /  
  63.     -outfile $CATALINA_HOME/logs/catalina.out /  
  64.     -errfile $CATALINA_HOME/logs/catalina.err /  
  65.     $CATALINA_OPTS /  
  66.     -cp $CLASSPATH /  
  67.     org.apache.catalina.startup.Bootstrap  
  68.     #  
  69.     # To get a verbose JVM  
  70.     #-verbose /  
  71.     # To get a debug of jsvc.  
  72.     #-debug /  
  73.     if test $? -eq 0  
  74.     then  
  75.         exit 0  
  76.     else  
  77.         echo "Failed to start tomcat6"  
  78.         exit 1  
  79.     fi  
  80.     ;;  
  81.   
  82.   stop)  
  83.     #  
  84.     # Stop Tomcat  
  85.     #  
  86.     $DAEMON_HOME/bin/jsvc /  
  87.     -stop /  
  88.     -pidfile $PID_FILE /  
  89.     org.apache.catalina.startup.Bootstrap  
  90.     if test $? -eq 0  
  91.     then  
  92.         echo "tomcat6 stopped"  
  93.         exit 0  
  94.     else  
  95.         echo "Failed to stop tomcat6"  
  96.         exit 1  
  97.     fi  
  98.     ;;  
  99.   
  100.   restart)  
  101.     #  
  102.     # Restart Tomcat  
  103.     #  
  104.     if $0 stop  
  105.     then  
  106.         $0 start  
  107.     else  
  108.         echo "Failed to stop running server, so refusing to try to start."  
  109.     fi  
  110.     exit 0  
  111.     ;;  
  112.   
  113.   
  114.   *)  
  115.     echo "Usage: tomcat6 start|stop|restart"  
  116.     exit 1;;  
  117. esac  

在以的脚本里面指定了TOMCAT_USER,jsvc将先以特权身份启动tomcat,随后切换到指定的用户,这样可以使tomcat以非特权身份监听需要特权的端口。

将脚本复制到/etc/init.d,改名为tomcat6,然后执行

[php]  view plain copy
  1. update-rc.d tomcat6 defaults  

配置完成以后,tomcat就可以以非特权用户作为daemon运行了。

Logo

更多推荐