Tomcat

tomcat無法在jpda啟動模式下啟動

  • October 9, 2014

這是我的catalina.sh

#!/bin/sh

JAVA_HOME="/usr/local/java"
CATALINA_PID="/usr/local/tomcat/tomcat.pid"
CATALINA_HOME="/usr/local/tomcat"
JAVA_OPTS="-Xloggc:/usr/local/tomcat/logs/gc.log -Xms3072m -Xmx3072m -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 -XX:CMSIncrementalDutyCycle=10 -XX:CMSIncrementalSafetyFactor=75 -XX:NewSize=512m -XX:MaxNewSize=1536m -XX:PermSize=48m -XX:MaxPermSize=174m"
JAVA_OPTS="$JAVA_OPTS -Djavax.servlet.request.encoding=ISO-8859-1"
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=ISO-8859-1"
#JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8097 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"

JAVA_OPTS="$JAVA_OPTS -Dsun.net.inetaddr.ttl=30"
# OS specific support.  $var _must_ be set to either true or false.
cygwin=false
darwin=false
os400=false
case "`uname`" in
CYGWIN*) cygwin=true;;
Darwin*) darwin=true;;
OS400*) os400=true;;
esac

# resolve links - $0 may be a softlink
PRG="$0"

while [ -h "$PRG" ]; do
 ls=`ls -ld "$PRG"`
 link=`expr "$ls" : '.*-> \(.*\)$'`
 if expr "$link" : '/.*' > /dev/null; then
   PRG="$link"
 else
   PRG=`dirname "$PRG"`/"$link"
 fi
done

# Get standard environment variables
PRGDIR=`dirname "$PRG"`

# Only set CATALINA_HOME if not already set
[ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." >/dev/null; pwd`

# Copy CATALINA_BASE from CATALINA_HOME if not already set
[ -z "$CATALINA_BASE" ] && CATALINA_BASE="$CATALINA_HOME"

# Ensure that any user defined CLASSPATH variables are not used on startup,
# but allow them to be specified in setenv.sh, in rare case when it is needed.
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

# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin; then
 [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
 [ -n "$JRE_HOME" ] && JRE_HOME=`cygpath --unix "$JRE_HOME"`
 [ -n "$CATALINA_HOME" ] && CATALINA_HOME=`cygpath --unix "$CATALINA_HOME"`
 [ -n "$CATALINA_BASE" ] && CATALINA_BASE=`cygpath --unix "$CATALINA_BASE"`
 [ -n "$CLASSPATH" ] && CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi

# For OS400
if $os400; then
 # Set job priority to standard for interactive (interactive - 6) by using
 # the interactive priority - 6, the helper threads that respond to requests
 # will be running at the same priority as interactive jobs.
 COMMAND='chgjob job('$JOBNAME') runpty(6)'
 system $COMMAND

 # Enable multi threading
 export QIBM_MULTI_THREADED=Y
fi

# Get standard Java environment variables
if $os400; then
 # -r will Only work on the os400 if the files are:
 # 1. owned by the user
 # 2. owned by the PRIMARY group of the user
 # this will not work if the user belongs in secondary groups
 . "$CATALINA_HOME"/bin/setclasspath.sh
else
 if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then
   . "$CATALINA_HOME"/bin/setclasspath.sh
 else
   echo "Cannot find $CATALINA_HOME/bin/setclasspath.sh"
   echo "This file is needed to run this program"
   exit 1
 fi
fi

# Add on extra jar files to CLASSPATH
if [ ! -z "$CLASSPATH" ] ; then
 CLASSPATH="$CLASSPATH":
fi
CLASSPATH="$CLASSPATH""$CATALINA_HOME"/bin/bootstrap.jar

if [ -z "$CATALINA_OUT" ] ; then
 CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
fi

if [ -z "$CATALINA_TMPDIR" ] ; then
 # Define the java.io.tmpdir to use for Catalina
 CATALINA_TMPDIR="$CATALINA_BASE"/temp
fi

# Add tomcat-juli.jar to classpath
# tomcat-juli.jar can be over-ridden per instance
if [ -r "$CATALINA_BASE/bin/tomcat-juli.jar" ] ; then
 CLASSPATH=$CLASSPATH:$CATALINA_BASE/bin/tomcat-juli.jar
else
 CLASSPATH=$CLASSPATH:$CATALINA_HOME/bin/tomcat-juli.jar
fi

# Bugzilla 37848: When no TTY is available, don't output to console
have_tty=0
if [ "`tty`" != "not a tty" ]; then
   have_tty=1
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
 JAVA_HOME=`cygpath --absolute --windows "$JAVA_HOME"`
 JRE_HOME=`cygpath --absolute --windows "$JRE_HOME"`
 CATALINA_HOME=`cygpath --absolute --windows "$CATALINA_HOME"`
 CATALINA_BASE=`cygpath --absolute --windows "$CATALINA_BASE"`
 CATALINA_TMPDIR=`cygpath --absolute --windows "$CATALINA_TMPDIR"`
 CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
 JAVA_ENDORSED_DIRS=`cygpath --path --windows "$JAVA_ENDORSED_DIRS"`
fi

# Set juli LogManager config file if it is present and an override has not been issued
if [ -z "$LOGGING_CONFIG" ]; then
 if [ -r "$CATALINA_BASE"/conf/logging.properties ]; then
   LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties"
 else
   # Bugzilla 45585
   LOGGING_CONFIG="-Dnop"
 fi
fi

if [ -z "$LOGGING_MANAGER" ]; then
 JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
else
 JAVA_OPTS="$JAVA_OPTS $LOGGING_MANAGER"
fi

# Uncomment the following line to make the umask available when using the
# org.apache.catalina.security.SecurityListener
#JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"

# ----- Execute The Requested Command -----------------------------------------

# Bugzilla 37848: only output this if we have a TTY
if [ $have_tty -eq 1 ]; then
 echo "Using CATALINA_BASE:   $CATALINA_BASE"
 echo "Using CATALINA_HOME:   $CATALINA_HOME"
 echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR"
 if [ "$1" = "debug" ] ; then
   echo "Using JAVA_HOME:       $JAVA_HOME"
 else
   echo "Using JRE_HOME:        $JRE_HOME"
 fi
 echo "Using CLASSPATH:       $CLASSPATH"
 if [ ! -z "$CATALINA_PID" ]; then
   echo "Using CATALINA_PID:    $CATALINA_PID"
 fi
fi

if [ "$1" = "jpda" ] ; then
 if [ -z "$JPDA_TRANSPORT" ]; then
   JPDA_TRANSPORT="dt_socket"
 fi
 if [ -z "$JPDA_ADDRESS" ]; then
   JPDA_ADDRESS="8000"
 fi
 if [ -z "$JPDA_SUSPEND" ]; then
   JPDA_SUSPEND="n"
 fi
 if [ -z "$JPDA_OPTS" ]; then
   JPDA_OPTS="-agentlib:jdwp=transport=$JPDA_TRANSPORT,address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND"
 fi
 CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS"
 shift
fi

if [ "$1" = "debug" ] ; then
 if $os400; then
   echo "Debug command not available on OS400"
   exit 1
 else
   shift
   if [ "$1" = "-security" ] ; then
     if [ $have_tty -eq 1 ]; then
       echo "Using Security Manager"
     fi
     shift
     exec "$_RUNJDB" "$LOGGING_CONFIG" $JAVA_OPTS $CATALINA_OPTS \
       -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
       -sourcepath "$CATALINA_HOME"/../../java \
       -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
   else
     exec "$_RUNJDB" "$LOGGING_CONFIG" $JAVA_OPTS $CATALINA_OPTS \
       -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" -classpath "$CLASSPATH" \
       -sourcepath "$CATALINA_HOME"/../../java \
       -Dcatalina.base="$CATALINA_BASE" \
       -Dcatalina.home="$CATALINA_HOME" \
       -Djava.io.tmpdir="$CATALINA_TMPDIR" \
       org.apache.catalina.startup.Bootstrap "$@" start
   fi
 fi

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

 shift
 if [ "$1" = "-security" ] ; then
   if [ $have_tty -eq 1 ]; then
     echo "Using Security Manager"
   fi
   shift
   eval exec \"$_RUNJAVA\" \"$LOGGING_CONFIG\" $JAVA_OPTS $CATALINA_OPTS \
     -Djava.endorsed.dirs=\"$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
 else
   eval exec \"$_RUNJAVA\" \"$LOGGING_CONFIG\" $JAVA_OPTS $CATALINA_OPTS \
     -Djava.endorsed.dirs=\"$JAVA_ENDORSED_DIRS\" -classpath \"$CLASSPATH\" \
     -Dcatalina.base=\"$CATALINA_BASE\" \
     -Dcatalina.home=\"$CATALINA_HOME\" \
     -Djava.io.tmpdir=\"$CATALINA_TMPDIR\" \
     org.apache.catalina.startup.Bootstrap "$@" start
 fi

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."
           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 \"$_RUNJAVA\" \"$LOGGING_CONFIG\" $JAVA_OPTS $CATALINA_OPTS \
     -Djava.endorsed.dirs=\"$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
   eval \"$_RUNJAVA\" \"$LOGGING_CONFIG\" $JAVA_OPTS $CATALINA_OPTS \
     -Djava.endorsed.dirs=\"$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

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

 shift

 SLEEP=5
 if [ ! -z "$1" ]; then
   echo $1 | grep "[^0-9]" >/dev/null 2>&1
   if [ $? -gt 0 ]; then
     SLEEP=$1
     shift
   fi
 fi

 FORCE=0
 if [ "$1" = "-force" ]; then
   shift
   FORCE=1
 fi

 if [ ! -z "$CATALINA_PID" ]; then
   if [ -f "$CATALINA_PID" ]; then
     if [ -s "$CATALINA_PID" ]; then
       kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1
       if [ $? -gt 0 ]; then
         echo "PID file found but no matching process was found. Stop aborted."
         exit 1
       fi
     else
       echo "PID file is empty and has been ignored."
     fi
   else
     echo "\$CATALINA_PID was set but the specified file does not exist. Is Tomcat running? Stop aborted."
     exit 1
   fi
 fi

 eval \"$_RUNJAVA\" $JAVA_OPTS \
   -Djava.endorsed.dirs=\"$JAVA_ENDORSED_DIRS\" -classpath \"$CLASSPATH\" \
   -Dcatalina.base=\"$CATALINA_BASE\" \
   -Dcatalina.home=\"$CATALINA_HOME\" \
   -Djava.io.tmpdir=\"$CATALINA_TMPDIR\" \
   org.apache.catalina.startup.Bootstrap "$@" stop

 if [ ! -z "$CATALINA_PID" ]; then
   if [ -f "$CATALINA_PID" ]; then
     while [ $SLEEP -ge 0 ]; do
       kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1
       if [ $? -gt 0 ]; then
         rm -f "$CATALINA_PID" >/dev/null 2>&1
         if [ $? != 0 ]; then
           if [ -w "$CATALINA_PID" ]; then
             cat /dev/null > "$CATALINA_PID"
           else
             echo "Tomcat stopped but the PID file could not be removed or cleared."
           fi
         fi
         break
       fi
       if [ $SLEEP -gt 0 ]; then
         sleep 1
       fi
       if [ $SLEEP -eq 0 ]; then
         if [ $FORCE -eq 0 ]; then
           echo "Tomcat did not stop in time. PID file was not removed."
         fi
       fi
       SLEEP=`expr $SLEEP - 1 `
     done
   fi
 fi

 if [ $FORCE -eq 1 ]; then
   if [ -z "$CATALINA_PID" ]; then
     echo "Kill failed: \$CATALINA_PID not set"
   else
     if [ -f "$CATALINA_PID" ]; then
       PID=`cat "$CATALINA_PID"`
       echo "Killing Tomcat with the PID: $PID"
       kill -9 $PID
       rm -f "$CATALINA_PID" >/dev/null 2>&1
       if [ $? != 0 ]; then
         echo "Tomcat was killed but the PID file could not be removed."
       fi
     fi
   fi
 fi

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

   eval \"$_RUNJAVA\" $JAVA_OPTS \
     -Djava.endorsed.dirs=\"$JAVA_ENDORSED_DIRS\" -classpath \"$CLASSPATH\" \
     -Dcatalina.base=\"$CATALINA_BASE\" \
     -Dcatalina.home=\"$CATALINA_HOME\" \
     -Djava.io.tmpdir=\"$CATALINA_TMPDIR\" \
     org.apache.catalina.startup.Bootstrap configtest
   result=$?
   if [ $result -ne 0 ]; then
       echo "Configuration error detected!"
   fi
   exit $result

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

   "$_RUNJAVA"   \
     -classpath "$CATALINA_HOME/lib/catalina.jar" \
     org.apache.catalina.util.ServerInfo

else

 echo "Usage: catalina.sh ( commands ... )"
 echo "commands:"
 if $os400; then
   echo "  debug             Start Catalina in a debugger (not available on OS400)"
   echo "  debug -security   Debug Catalina with a security manager (not available on OS400)"
 else
   echo "  debug             Start Catalina in a debugger"
   echo "  debug -security   Debug Catalina with a security manager"
 fi
 echo "  jpda start        Start Catalina under JPDA debugger"
 echo "  run               Start Catalina in the current window"
 echo "  run -security     Start in the current window with security manager"
 echo "  start             Start Catalina in a separate window"
 echo "  start -security   Start in a separate window with security manager"
 echo "  stop              Stop Catalina, waiting up to 5 seconds for the process to end"
 echo "  stop n            Stop Catalina, waiting up to n seconds for the process to end"
 echo "  stop -force       Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running"
 echo "  stop n -force     Stop Catalina, wait up to n seconds and then use kill -KILL if still running"
 echo "  configtest        Run a basic syntax check on server.xml - check exit code for result"
 echo "  version           What version of tomcat are you running?"
 echo "Note: Waiting for the process to end and use of the -force option require that \$CATALINA_PID is defined"
 exit 1

fi

開始後**./catalina.sh jpda start** 我得到了

ERROR: Cannot load this JVM TI agent twice, check your java command line for duplicate jdwp options.
Error occurred during initialization of VM
agent library failed to init: jdwp

而且我無法在 Eclipse 中進行遠端調試

但是如果我啟動正常的tomcat正在啟動

您應該在 JAVA_OPTS 環境變數中設置開關,或者參數傳遞給,但不能同時傳遞。如果你兩者都做,它會嘗試載入代理兩次並給你一個錯誤。-Xdebug -Xrunjdwp...``jpda``catalina.sh

編輯:我個人更喜歡使用 JAVA_OPTS 開關,因為它們提供了更多控制權(例如設置埠號)。完成此操作並重新啟動 Tomcat 後,您應該能夠從 Eclipse 與調試器連接。

要從 Eclipse 連接,您需要創建類型為“Remote Java Application”的調試配置: 從“執行”菜單中,選擇“調試配置…”。在左側窗格中,選擇“遠端 Java 應用程序”並點擊“新建”按鈕。在右側窗格中,選擇項目,然後在主機欄位中輸入 Tomcat 伺服器的 IP 地址。您可以保留其他欄位的預設值。然後點擊底部的 Debug,Eclipse 調試器應該連接到 Tomcat。

引用自:https://serverfault.com/questions/634426