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

  1. #!/bin/bash
  2. #
  3. # tomcat startup script for the Tomcat server
  4. #
  5. # chkconfig: 345 80 20
  6. # description: start the tomcat deamon
  7. #
  8. # Source function library
  9. . /etc/rc.d/init.d/functions
  10.  
  11. prog=tomcat7
  12. USER=worker
  13. TOMCAT_PORT=8080
  14. JAVA_HOME=/home/worker/usr/local/jdk
  15. CATALANA_HOME=/home/worker/opt/tomcat7
  16. export JAVA_HOME
  17. export CATALINA_HOME
  18.  
  19.  
  20. if [ "`id -un`" == "$USER" ]
  21. then
  22. user_do='sh'
  23. else
  24. user_do="/sbin/runuser -l $USER"
  25. fi
  26.  
  27. start()
  28. {
  29. echo -n "Starting ${prog}..."
  30. $user_do -c "$CATALANA_HOME/bin/startup.sh"
  31. PID=`ps aux |grep $CATALANA_HOME/temp |grep -v grep |awk '{print $2}' `
  32. echo [start ${prog} OK:$PID]
  33. }
  34. stop() {
  35. echo -n "Stopping ${prog}..."
  36. $user_do -c "$CATALANA_HOME/bin/shutdown.sh"
  37. time_used=0
  38. PID=`ps aux |grep $CATALANA_HOME/temp |grep -v grep |awk '{print $2}' |xargs`
  39. while [ -n "$PID" ] && [ "${time_used}" -le "30" ]
  40. do
  41. sleep 5
  42. time_used=`expr ${time_used} + 5`
  43. PID=`ps aux |grep $CATALANA_HOME/temp |grep -v grep |awk '{print $2}' |xargs`
  44. echo "Waitting for shutdown tomcat pid : $PID ; time: $time_used"
  45. done
  46. [ -n "$PID" ] && echo "shutdown used too long,now to kill $PID" && kill -9 $PID
  47. echo [shutdown ${prog} OK:$PID]
  48. }
  49. version() {
  50. $user_do -c "$CATALANA_HOME/bin/version.sh"
  51. }
  52.  
  53. case "$1" in
  54. start)
  55. start
  56. ;;
  57. stop)
  58. stop
  59. ;;
  60. version)
  61. version
  62. ;;
  63. restart)
  64. stop
  65. sleep 2
  66. start
  67. ;;
  68. *)
  69. echo "Usage: $prog {start|stop|restart|version}"
  70. ;;
  71. esac
  72. exit 0

猜你在找的CentOS相关文章