Linux 下两种自动启动 Tomcat 的方法

PHPABC Tomcat 871 次浏览 , , 没有评论

有很多办法可以让Tomcat在系统启动的时候自动运行,我这里介绍两种方法,一种简单,另外一种复杂而专业。在介绍这两个方法前你应该先装JDK,Tomcat。Tomcat的安装很简单,下载二进制压缩包 xxx.tar.gz ,用 tar zxvf xxx.tar.gz -C [target],[target]是安装Tomcat的目录。设置环境变量JDK_HOME和JAVA_HOME都指向JDK的安装目录即可。

一. 简单的方法

Tomcat安装目录下的bin目录有两个脚本分别用来启动和停止Tomcat,分别是startup.sh, shutdown.sh,你可以用这两个脚本来手工启动和停止Tomcat服务并进行安装后的测试。

我们最简单的方法就是通过startup.sh来自动启动Tomcat,编辑/etc/rc.d/rc.local 增加内容(假设JDK目录是/usr/jdk,Tomcat目录是/apache/tomcat)

export JDK_HOME=/usr/jdk
export JAVA_HOME=/usr/jdk
/apache/tomcat/bin/startup.sh

这样在系统重启后就可以自动启动Tomcat

二. 复杂而专业的方法

前面介绍的应该是最简单的让Tomcat自动启动的方法了,但是它有两个不足
1. 无法指定启动Tomcat服务的用户,会导致Tomcat已超级用户运行,存在重大的安全隐患
2. 系统关闭的时候无法自动停止Tomcat服务

在Linux下,Tomcat可以作为一个守护进程来启动以及停止,这个必须借助于项目commons-daemon中的jsvc工具。Tomcat安装完后就带有这个工具的源码{tomcat}/bin/jsvc.tar.gz。按照下列命令安装这个工具:

解压: tar zxvf jsvc.tar.gz
配置: cd jsvc-src
chmod +x configure
./configure –with-java=/usr/jdk
编译: make
检验: ./jsvc -help

jsvc工具本身带了一个脚本用来启动和停止Tomcat守护进程,但是在试验中发现该脚本无法设置为自动启动,显示的错误信息是:tomcat 服务不支持 chkconfig,因此修改了此脚本,脚本在最后。

修改下载的脚本里面有关路径的信息以及要启动Tomcat的用户(用户必须已存在),拷贝脚本到/etc/rc.d/init.d目录下的tomcat文件,给该脚本赋予可执行权限(chmod +x tomcat),你可以使用命令/etc/rc.d/init.d/tomcat start|stop 来验证守护进程是否可以正常启动和停止。

接下来就是把这个脚本设置成系统启动时自动执行,系统关闭时自动停止,使用如下命令:
chkconfig –add tomcat

重新启动系统后可以启动的过程中看到Starting Tomcat ….. [OK]的信息,这样就完成设置过程。

启动脚本:

#! /bin/sh
 
# chkconfig: 35 96 04
# description: Apache-Tomcat service script.
 
# Version:
#        2008-01-17-01
# By:
#        Typhoon.Free.Wolf.
 
# Service name.
SVC_NAME="Apache-Tomcat"
# Lock file.
LOCK_FILE="/var/lock/subsys/tfw_tomcat"
# Installation prefix.
APP_HOME="/ext/prog/c/Apache/Tomcat"
# The process name to monitor.
APP_PROC="java"
# Authorize user.
APP_USER="userXXX"
 
SLEEP_START=5
SLEEP_STOP=$SLEEP_START
 
# Importing functions.
flg_func=0
if [ -f /etc/init.d/functions ] ; then
        . /etc/init.d/functions
        flg_func=1
elif [ -f /etc/rc.d/init.d/functions ] ; then
        . /etc/rc.d/init.d/functions
        flg_func=1
fi
 
# Templete.
# Return:
#        FLG_PROC_ON means process is there.
#        FLG_PROC_OFF means process not exists.
#        Other means error.
FLG_PROC_ON=1
FLG_PROC_OFF=0
probe() {
        srch_rst=$(ps -A|grep $APP_PROC|awk '{print $4}')
        for rst in $srch_rst ; do
                if [ $APP_PROC = $rst ] ; then
                        return $FLG_PROC_ON
                fi
        done
        return $FLG_PROC_OFF
}
 
# Templete.
#        Shows OK.
# Return:
echo_ok() {
        case $flg_func in
                1)
                        echo_success
                        echo ""
                ;;
                *)
                        echo ""
                        echo "        [  OK  ]"
                ;;
        esac
}
 
# Templete.
#        Shows Passed.
# Return:
echo_pass() {
        case $flg_func in
                1)
                        echo_passed
                        echo ""
                ;;
                *)
                        echo ""
                        echo "        [PASSED]"
                ;;
        esac
}
 
# Templete.
#        Shows Failed.
# Return:
echo_bad() {
        case $flg_func in
                1)
                        echo_failure
                        echo ""
                ;;
                *)
                        echo ""
                        echo "        [FAILED]"
                ;;
        esac
}
 
# Templete.
#        Start section.
# Return:
_start() {
        probe
        proc=$?
        echo ""
        echo "Starting $SVC_NAME..."
 
        if (touch $LOCK_FILE) ; then
                echo_ok
        else
                echo_bad
        fi
}
 
start() {
        probe
        proc=$?
        echo ""
        echo "Starting $SVC_NAME..."
 
        if [ $FLG_PROC_OFF = $proc ] ; then
                if (su - $APP_USER -c "$APP_HOME/bin/startup.sh") ; then
                        sleep $SLEEP_START
                        if (touch $LOCK_FILE) ; then
                                echo_ok
                        else
                                echo_pass
                                echo ""
                        fi
                else
                        echo_bad
                fi
        elif [ $FLG_PROC_ON = $proc ] ; then
                if (touch $LOCK_FILE) ; then
                        echo_passed
                        echo ""
                else
                        echo_bad
                fi
        fi
}
 
# Templete.
#        Stop section.
# Return:
_stop() {
        probe
        proc=$?
        echo ""
        echo "Stopping $SVC_NAME..."
 
        if (rm -Rf $LOCK_FILE) ; then
                echo_ok
        else
                echo_bad
        fi
}
 
stop() {
        probe
        proc=$?
        echo ""
        echo "Stopping $SVC_NAME..."
 
        if [ $FLG_PROC_OFF = $proc ] ; then
                if (rm -Rf $LOCK_FILE) ; then
                        echo_passed
                        echo ""
                else
                        echo_bad
                fi
        elif [ $FLG_PROC_ON = $proc ] ; then
                if (su - $APP_USER -c "$APP_HOME/bin/shutdown.sh") ; then
                        sleep $SLEEP_STOP
                        if (rm -Rf $LOCK_FILE) ; then
                                echo_ok
                        else
                                echo_pass
                                echo ""
                        fi
                else
                        echo_bad
                fi
        fi
}
 
# Parse command line parameters.
case $1 in
        start)
                start
        ;;
        stop)
                stop
        ;;
        restart)
                stop
                start
        ;;
        *)
                # Print help
                echo "Usage: $0 {start|stop|restart}"
                exit 1
        ;;
esac
 
exit 0

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Go