tomcat 9.0.11 源码分析--总结startup.sh与catalina.sh

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/c5113620/article/details/81909971

startup.sh与catalina.sh只是启动脚本,通过环境变量与脚本所在目录确定java的启动参数来正确启动tomcat, 从参数可以找到启动类是org.apache.catalina.startup.Bootstrap里的main方法

脚本中常用判断
if [ -z “$UMASK” ] 类似这样就是UMASK环境变量不存在时设置初始化

if [ -r “$CATALINA_HOME”/bin/setclasspath.sh ] 这是判断文件存在且可读

if [ -n “$JAVA_ENDORSED_DIRS” ] 存在环境变量时处理

if [ -d “$CATALINA_HOME/endorsed” ] 是目录处理

while [ -h “$PRG” ] 是软连接处理

dirname “$PRG” 取得文件所在目录,PRG问文件

打印启动参数
在catalina.sh的最后处理start参数那里,添加一系列的echo 打印输出参数

elif [ "$1" = "start" ] ; then

  if [ ! -z "$CATALINA_PID" ]; then
    if [ -f "$CATALINA_PID" ]; then
      if [ -s "$CATALINA_PID" ]; then
        echo "Existing PID file found during start."
        if [ -r "$CATALINA_PID" ]; then
          PID=`cat "$CATALINA_PID"`
          ps -p $PID >/dev/null 2>&1
          if [ $? -eq 0 ] ; then
            echo "Tomcat appears to still be running with PID $PID. Start aborted."
            echo "If the following process is not a Tomcat process, remove the PID file and try again:"
            ps -f -p $PID
            exit 1
          else
            echo "Removing/clearing stale PID file."
            rm -f "$CATALINA_PID" >/dev/null 2>&1
            if [ $? != 0 ]; then
              if [ -w "$CATALINA_PID" ]; then
                cat /dev/null > "$CATALINA_PID"
              else
                echo "Unable to remove or clear stale PID file. Start aborted."
                exit 1
              fi
            fi
          fi
        else
          echo "Unable to read PID file. Start aborted."
          exit 1
        fi
      else
        rm -f "$CATALINA_PID" >/dev/null 2>&1
        if [ $? != 0 ]; then
          if [ ! -w "$CATALINA_PID" ]; then
            echo "Unable to remove or write to empty PID file. Start aborted."
            exit 1
          fi
        fi
      fi
    fi
  fi

  shift
  touch "$CATALINA_OUT"
  if [ "$1" = "-security" ] ; then
    if [ $have_tty -eq 1 ]; then
      echo "Using Security Manager"
    fi
    shift
    eval $_NOHUP "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
      -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
      -classpath "\"$CLASSPATH\"" \
      -Djava.security.manager \
      -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
      -Dcatalina.base="\"$CATALINA_BASE\"" \
      -Dcatalina.home="\"$CATALINA_HOME\"" \
      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
      org.apache.catalina.startup.Bootstrap "$@" start \
      >> "$CATALINA_OUT" 2>&1 "&"

  else
    echo "_NOHUP:" $_NOHUP
    echo "_RUNJAVA:" $_RUNJAVA
    echo "LOGGING_CONFIG:" $LOGGING_CONFIG
    echo "LOGGING_MANAGER:" $LOGGING_MANAGER
    echo "JAVA_OPTS:" $JAVA_OPTS
    echo "CATALINA_OPTS:" $CATALINA_OPTS
    echo "ENDORSED_PROP:" $ENDORSED_PROP
    echo "JAVA_ENDORSED_DIRS:" $JAVA_ENDORSED_DIRS
    echo "CLASSPATH:" $CLASSPATH
    echo "CATALINA_BASE:" $CATALINA_BASE
    echo "CATALINA_HOME:" $CATALINA_HOME
    echo "CATALINA_TMPDIR:" $CATALINA_TMPDIR
    echo "CATALINA_OUT:" $CATALINA_OUT
    echo "print start parameters"
    exit 0
    eval $_NOHUP "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
      -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
      -classpath "\"$CLASSPATH\"" \
      -Dcatalina.base="\"$CATALINA_BASE\"" \
      -Dcatalina.home="\"$CATALINA_HOME\"" \
      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
      org.apache.catalina.startup.Bootstrap "$@" start \
      >> "$CATALINA_OUT" 2>&1 "&"

  fi

  if [ ! -z "$CATALINA_PID" ]; then
    echo $! > "$CATALINA_PID"
  fi

  echo "Tomcat started."

elif [ "$1" = "stop" ] ; then

得到参数后,可以自己在命令行直接 java 组装参数 运行tomcat

//这是组装参数的最后,$@表示所有传给catalina.sh的参数
//startup.sh传给catalina.sh start  catalina.sh在处理了第一个参数start
后使用shift,移除了第一个参数,所以下面不会有两个start
org.apache.catalina.startup.Bootstrap "$@" start \
      >> "$CATALINA_OUT" 2>&1 "&"

startup.sh 就是找到catalina.sh的目录,并加参数start运行

./catalina.sh start 因为执行的命令是: java 参数 & 所以会后台执行
./catalina.sh run 可以在终端运行,看日志
./catalina.sh 没有参数打印帮助文档

下面是我整理的启动参数,mac系统,路径可能需要修改,umask值修改

java -Djava.util.logging.config.file=/Users/Downloads/apache-tomcat-9.0.11/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 "/Users/Downloads/apache-tomcat-9.0.11/bin/bootstrap.jar:/Users/Downloads/apache-tomcat-9.0.11/bin/tomcat-juli.jar" -Dcatalina.base="/Users/Downloads/apache-tomcat-9.0.11" -Dcatalina.home="/Users/Downloads/apache-tomcat-9.0.11" -Djava.io.tmpdir="/Users/Downloads/apache-tomcat-9.0.11/temp" org.apache.catalina.startup.Bootstrap start >>/Users/Downloads/apache-tomcat-9.0.11/logs/catalina.out 2>&1

自定义环境变量,可以编写setenv.sh,放到CATALINA_BASE/bin下面,catalina.sh启动会加载,比如要加载的类jar包等等,全局

CLASSPATH=

if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
  . "$CATALINA_BASE/bin/setenv.sh"
elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
  . "$CATALINA_HOME/bin/setenv.sh"
fi

猜你喜欢

转载自blog.csdn.net/c5113620/article/details/81909971
今日推荐