centos6_tomcat7开机启动问题排查

前端之家收集整理的这篇文章主要介绍了centos6_tomcat7开机启动问题排查前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

环境:

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  

猜你在找的CentOS相关文章