您的位置:首页 > 运维架构 > Tomcat

centos6_tomcat7开机启动问题排查

2017-10-23 15:22 656 查看
环境:

centos6.6

tomcat7.0.72

jdk1.8.0_92

最近配置tomcat启动脚本

发现每次重启后,tomcat都会重启失败,查看tomcat启动日志还会发现有报错如下:

Caused by: java.net.BindException: Address already in use <null>:8080

#因为centos6开机初始化init系统用的是UpStart进行管理的,虽然启动顺序还是顺序执行的,但是相比传统的sysvinit做了一定的启动优化,提高了开机启动的速度。

#开始的时候分析认为是新的启动模式,导致端口服务还没启动的时候,tomcat服务已经先启动,引起的tomcat启动失败。

#所以在启动脚本/etc/init.d/tomcat7前面添加这个字段:

if [ "$runlevel" == "3" -a "$previous" == "N" ]

then

        sleep 60

fi

#多次反复试验发现,发现配置该配置后后,有时候可以成功启动,有时候还是有问题。

#虽然开机启动的时候等了60秒,但是 依旧重启有问题。

#为了获得系统的开机启动时候,真实的启动过程,找到一个相对简单稳定的启动脚本/etc/init.d/ntpd,做简单修改,获取系统启动的一些jincheng

vim /etc/rc.d/init.d/S58ntpd

#添加脚本,用于获取开机过程 进程的变化过程

sh /tmp/restart/restart_ps_aux.sh &

#/tmp/restart/restart_ps_aux.sh脚本内容如下:

cat /tmp/restart/restart_ps_aux.sh

#!/bin/bash

for i in `seq 1 80`

do
ps -ef >/tmp/restart/ps/`date +%H%M%S`
sleep 1

done

#最终发现在服务重启过程中 他会按照顺序依次执行/etc/rc.d/rc3.d/ 下面的脚本,不会并发执行里面的脚本,而且执行的时候是通过start的方式调用。如:

/etc/rc.d/init.d/S58ntpd start

#在我不断的测试和发现,最终在查看/etc/rc.d/rc3.d/S99local 的时候发现了问题。

发现原来在这个脚本里面我们添加了tomcat的启动命令,导致了tomcat的重复启动。导致了服务的启动失败。

runuser -l worker -c 'sh /home/worker/opt/tomcat7/bin/startup.sh'

#后来查看发现

原来/etc/rc.local 和 /etc/rc.d/rc3.d/S99local 都是/etc/rc.d/rc.local的软连接

但是我们的系统有的是软连接,有的是真实文件。

#进一步分析查看后发现

我们的之前写过脚本,通过sed -i替换/etc/rc.local里面的内容,导致/etc/rc.local变成一个独立的文本文件,而不是/etc/rc.d/rc.local的软连接。

sed -i 替换的时候,会把sed处理后的内容已新建文件的方式替换原来的文件,把一个软连接文件变成一个独立的问题(对于连接文件慎用)

重新处理后,把/etc/rc.local重新链接为/etc/rc.d/rc.local文件后,并清空里面的启动项后,重新启动,发现tomcat可以成功启动了。

#因为公司使用普通用户启动服务,而且一个机器会部署多个tomcat实例,所以这里的端口,jdk目录,tomcat目录都是变量传入的,所以脚本前面定义了多个变量。

我的脚本如下:

cat /etc/init.d/tomcat7

#!/bin/bash
#
# tomcat startup script for the Tomcat server
#
# chkconfig: 345 80 20
# description: start the tomcat deamon
#
# Source function library
. /etc/rc.d/init.d/functions

prog=tomcat7
USER=worker
TOMCAT_PORT=8080
JAVA_HOME=/home/worker/usr/local/jdk
CATALANA_HOME=/home/worker/opt/tomcat7
export JAVA_HOME
export CATALINA_HOME

if [ "`id -un`" == "$USER" ]
then
user_do='sh'
else
user_do="/sbin/runuser -l $USER"
fi

start()
{
echo -n "Starting ${prog}..."
$user_do -c "$CATALANA_HOME/bin/startup.sh"
PID=`ps aux |grep $CATALANA_HOME/temp |grep -v grep |awk '{print $2}' `
echo [start ${prog} OK:$PID]
}
stop() {
echo -n "Stopping ${prog}..."
$user_do -c "$CATALANA_HOME/bin/shutdown.sh"
time_used=0
PID=`ps aux |grep $CATALANA_HOME/temp |grep -v grep |awk '{print $2}' |xargs`
while [ -n "$PID" ] && [ "${time_used}" -le "30" ]
do
sleep 5
time_used=`expr ${time_used} + 5`
PID=`ps aux |grep $CATALANA_HOME/temp |grep -v grep |awk '{print $2}' |xargs`
echo "Waitting for shutdown tomcat pid : $PID ; time: $time_used"
done
[ -n "$PID" ] && echo "shutdown used too long,now to kill $PID" && kill -9 $PID
echo [shutdown ${prog} OK:$PID]
}
version() {
$user_do -c "$CATALANA_HOME/bin/version.sh"
}

case "$1" in
start)
start
;;
stop)
stop
;;
version)
version
;;
restart)
stop
sleep 2
start
;;
*)
echo "Usage: $prog {start|stop|restart|version}"
;;
esac
exit 0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tomcat7 centos rc.local sed