环境:
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