Tomca启动脚本遇到的坑

tomcat脚本:

原始脚本:

[root@devops01-web-53 scripts]# cat Tomcat-init 
#!/bin/bash
### BEGIN INIT INFO
# Provides:          tomcat
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: tomcat-server daemon
# Description:       tomcat-server daemon
### END INIT INFO
#
# chkconfig: - 95 15
# description: Tomcat start/stop/status script

#Location of JAVA_HOME (bin files)
export JAVA_HOME=

#Add Java binary files to PATH
export PATH=$JAVA_HOME/bin:$PATH

#CATALINA_HOME is the location of the configuration files of this instance of Tomcat
CATALINA_HOME=/usr/local/tomcat

#TOMCAT_USER is the default user of tomcat
TOMCAT_USER=www

#TOMCAT_USAGE is the message if this script is called without any options
TOMCAT_USAGE="Usage: $0 {\e[00;32mstart\e[00m|\e[00;31mstop\e[00m|\e[00;32mstatus\e[00m|\e[00;31mrestart\e[00m}"

#SHUTDOWN_WAIT is wait time in seconds for java proccess to stop
SHUTDOWN_WAIT=20

tomcat_pid() {
  echo `ps -ef | grep $CATALINA_HOME/ | grep -v grep | tr -s " "|cut -d" " -f2`
}

start() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]; then
    echo -e "\e[00;31mTomcat is already running (pid: $pid)\e[00m"
  else
    echo -e "\e[00;32mStarting tomcat\e[00m"
    if [ `user_exists $TOMCAT_USER` = "1" ]; then
      su $TOMCAT_USER -c $CATALINA_HOME/bin/startup.sh
    else
      $CATALINA_HOME/bin/startup.sh
    fi
    status
  fi
  return 0
}

status() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]; then
    echo -e "\e[00;32mTomcat is running with pid: $pid\e[00m"
  else
    echo -e "\e[00;31mTomcat is not running\e[00m"
  fi
}

stop() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]; then
    echo -e "\e[00;31mStoping Tomcat\e[00m"
    $CATALINA_HOME/bin/shutdown.sh

    let kwait=$SHUTDOWN_WAIT
    count=0;
    until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ]
    do
      echo -n -e "\e[00;31mwaiting for processes to exit\e[00m\n";
      sleep 1
      let count=$count+1;
    done

    if [ $count -gt $kwait ]; then
      echo -n -e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m"
      kill -9 $pid
    fi
  else
    echo -e "\e[00;31mTomcat is not running\e[00m"
  fi

  return 0
}

user_exists() {
  if id -u $1 >/dev/null 2>&1; then
    echo "1"
  else
    echo "0"
  fi
}

case $1 in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  status)
    status
    ;;
  *)
    echo -e $TOMCAT_USAGE
    ;;
esac
exit 0
[root@devops01-web-53 scripts]#

tomcat启动的时候看不出异常,关闭的时候回报错类似:

SEVERE: Could not contact [localhost:[8005]]. Tomcat may not be running.

[root@szxjdw01-web-27 ~]# /application/tomcat-sbce/bin/shutdown.sh 
Using CATALINA_BASE:   /application/tomcat-sbce
Using CATALINA_HOME:   /application/tomcat-sbce
Using CATALINA_TMPDIR: /application/tomcat-sbce/temp
Using JRE_HOME:        /usr/java/jdk
Using CLASSPATH:       /application/tomcat-sbce/bin/bootstrap.jar:/application/tomcat-sbce/bin/tomcat-juli.jar
Jul 26, 2018 10:58:18 AM org.apache.catalina.startup.Catalina stopServer
SEVERE: Could not contact [localhost:[8005]]. Tomcat may not be running.
Jul 26, 2018 10:58:18 AM org.apache.catalina.startup.Catalina stopServer
SEVERE: Catalina.stop: 
java.net.ConnectException: Connection refused (Connection refused)
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:589)
        at java.net.Socket.connect(Socket.java:538)
        at java.net.Socket.<init>(Socket.java:434)
        at java.net.Socket.<init>(Socket.java:211)
        at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:497)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:406)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:495)

即为8005端口未运行,使用命令netstat -ant 发现 没有找到8005端口

[root@devops01-web-53 scripts]# netstat -lntup|grep java
tcp        0      0 :::8009                     :::*                        LISTEN      10373/java          
tcp        0      0 :::8080                     :::*                        LISTEN      10373/java

解决办法:

修改$JAVA_HOME/jre/lib/security/Java.security 文件中 securerandom.source 配置项:

将 
securerandom.source=file:/dev/random 
修改为: 
securerandom.source=file:/dev/urandom(网上查询的结果,我改完这个就可以了,下面的未测试) 
如果,仍然不生效,则修改为: file:/dev/./urandom

实战如下:

[root@devops01-web-53 scripts]# vim /usr/java/jdk/jre/lib/security/java.security
securerandom.source=file:/dev/random
修改为
securerandom.source=file:/dev/urandom

再次启动tomcat就有8005端口了,提示不是立刻就有8005端口,要等一小会才会有。

[root@devops01-web-53 scripts]# netstat -lntup|grep java
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      10615/java          
tcp        0      0 :::8009                     :::*                        LISTEN      10615/java          
tcp        0      0 :::8080                     :::*                        LISTEN      10615/java

验证8005端口延时启动过程:

[root@szxjdw01-web-27 ~]# ps -ef|grep java
root      6578  6202  0 11:02 pts/1    00:00:00 grep java
[root@szxjdw01-web-27 ~]# /application/tomcat-sbce/bin/startup.sh 
Using CATALINA_BASE:   /application/tomcat-sbce
Using CATALINA_HOME:   /application/tomcat-sbce
Using CATALINA_TMPDIR: /application/tomcat-sbce/temp
Using JRE_HOME:        /usr/java/jdk
Using CLASSPATH:       /application/tomcat-sbce/bin/bootstrap.jar:/application/tomcat-sbce/bin/tomcat-juli.jar
Tomcat started.
[root@szxjdw01-web-27 ~]# ps -ef|grep java                        
root      6588     1 99 11:02 pts/1    00:00:10 /usr/java/jdk/bin/java -Djava.util.logging.config.file=/application/tomcat-sbce/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /application/tomcat-sbce/bin/bootstrap.jar:/application/tomcat-sbce/bin/tomcat-juli.jar -Dcatalina.base=/application/tomcat-sbce -Dcatalina.home=/application/tomcat-sbce -Djava.io.tmpdir=/application/tomcat-sbce/temp org.apache.catalina.startup.Bootstrap start
root      6610  6202  0 11:02 pts/1    00:00:00 grep java
[root@szxjdw01-web-27 ~]# netstat -lntup|grep java
tcp        0      0 :::8009                     :::*                        LISTEN      6588/java           
tcp        0      0 :::8080                     :::*                        LISTEN      6588/java           
[root@szxjdw01-web-27 ~]# /application/tomcat-sbce/bin/shutdown.sh 
Using CATALINA_BASE:   /application/tomcat-sbce
Using CATALINA_HOME:   /application/tomcat-sbce
Using CATALINA_TMPDIR: /application/tomcat-sbce/temp
Using JRE_HOME:        /usr/java/jdk
Using CLASSPATH:       /application/tomcat-sbce/bin/bootstrap.jar:/application/tomcat-sbce/bin/tomcat-juli.jar
Jul 26, 2018 11:02:48 AM org.apache.catalina.startup.Catalina stopServer
SEVERE: Could not contact [localhost:[8005]]. Tomcat may not be running.
Jul 26, 2018 11:02:48 AM org.apache.catalina.startup.Catalina stopServer
SEVERE: Catalina.stop: 
java.net.ConnectException: Connection refused (Connection refused)
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:589)
        at java.net.Socket.connect(Socket.java:538)
        at java.net.Socket.<init>(Socket.java:434)
        at java.net.Socket.<init>(Socket.java:211)
        at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:497)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:406)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:495)

[root@szxjdw01-web-27 ~]# netstat -lntup|grep java        
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      6588/java           
tcp        0      0 :::8009                     :::*                        LISTEN      6588/java           
tcp        0      0 :::8080                     :::*                        LISTEN      6588/java           
[root@szxjdw01-web-27 ~]# /application/tomcat-sbce/bin/shutdown.sh 
Using CATALINA_BASE:   /application/tomcat-sbce
Using CATALINA_HOME:   /application/tomcat-sbce
Using CATALINA_TMPDIR: /application/tomcat-sbce/temp
Using JRE_HOME:        /usr/java/jdk
Using CLASSPATH:       /application/tomcat-sbce/bin/bootstrap.jar:/application/tomcat-sbce/bin/tomcat-juli.jar
[root@szxjdw01-web-27 ~]# netstat -lntup|grep java




最后脚本被修改为:

[root@devops01-web-53 application]# cat /etc/init.d/tomcat-sbce
#!/bin/bash
### BEGIN INIT INFO
# Provides:          tomcat
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: tomcat-server daemon
# Description:       tomcat-server daemon
### END INIT INFO
#
# chkconfig: - 95 15
# description: Tomcat start/stop/status script

#Location of JAVA_HOME (bin files)
export JAVA_HOME=/usr/java/jdk

#Add Java binary files to PATH
export PATH=$JAVA_HOME/bin:$PATH

#CATALINA_HOME is the location of the configuration files of this instance of Tomcat
CATALINA_HOME=/application/tomcat-sbce

#TOMCAT_USER is the default user of tomcat
TOMCAT_USER=sysadmin

#TOMCAT_USAGE is the message if this script is called without any options
TOMCAT_USAGE="Usage: $0 {\e[00;32mstart\e[00m|\e[00;31mstop\e[00m|\e[00;32mstatus\e[00m|\e[00;31mrestart\e[00m}"

#SHUTDOWN_WAIT is wait time in seconds for java proccess to stop
SHUTDOWN_WAIT=20
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
actions(){
    RETVAL=$?
    if [ $RETVAL -eq 0 ];then
      action "Tomcat is $1" /bin/true
    else
      action "Tomcat is $1" /bin/false
    fi
}

tomcat_pid() {
  echo `ps -ef | grep $CATALINA_HOME | grep -v grep | tr -s " "|cut -d" " -f2`
}

start() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]; then
    echo -e "\e[00;31mTomcat is already running (pid: $pid)\e[00m"
  else
    echo -e "\e[00;32mStarting tomcat\e[00m"
    if [ `user_exists $TOMCAT_USER` = "1" ]; then
      su - $TOMCAT_USER -c $CATALINA_HOME/bin/startup.sh >/dev/null 2>&1 &
    else
      $CATALINA_HOME/bin/startup.sh
    fi
    status
    actions Started     
  fi
  return 0
}

status() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]; then
    echo -e "\e[00;32mTomcat is running with pid: $pid\e[00m"
  else
    echo -e "\e[00;31mTomcat is not running\e[00m"
  fi
}

stop() {
  pid=$(tomcat_pid)
  if [ -n "$pid" ]; then
    echo -e "\e[00;31mStoping Tomcat\e[00m"
    su - $TOMCAT_USER -c $CATALINA_HOME/bin/shutdown.sh >/dev/null 2>&1 &

    let kwait=$SHUTDOWN_WAIT
    count=0;
    until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ]
    do
      echo -n -e "\e[00;31mwaiting for processes to exit\e[00m\n";
      action stopped
      sleep 1
      let count=$count+1;
    done

    if [ $count -gt $kwait ]; then
      echo -n -e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m"
      kill -9 $pid
    fi
  else
    echo -e "\e[00;31mTomcat is not running\e[00m"
  fi

  return 0
}

user_exists() {
  if id -u $1 >/dev/null 2>&1; then
    echo "1"
  else
    echo "0"
  fi
}

case $1 in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  status)
    status
    ;;
  *)
    echo -e $TOMCAT_USAGE
    ;;
esac
exit 0

验证脚本:

脚本在root下面可以正常运行,在设置的普通账号可以运行,但是在非设置非root提示没有权限。


实际验证操作:有的机器8005可以立马启动,有的是延迟启动

相关文章
相关标签/搜索