diff --git a/arthas-boot.jar b/arthas-boot.jar index 712aaa9aa..1b247b58d 100644 Binary files a/arthas-boot.jar and b/arthas-boot.jar differ diff --git a/arthas-demo.jar b/arthas-demo.jar index d60d74bf9..810fbb7e7 100644 Binary files a/arthas-demo.jar and b/arthas-demo.jar differ diff --git a/as.sh b/as.sh index 4b29b596c..891b957a1 100755 --- a/as.sh +++ b/as.sh @@ -8,10 +8,10 @@ # program : Arthas # author : Core Engine @ Taobao.com -# date : 2020-08-11 +# date : 2020-11-04 # current arthas script version -ARTHAS_SCRIPT_VERSION=3.3.9 +ARTHAS_SCRIPT_VERSION=3.4.4 # SYNOPSIS # rreadlink @@ -88,17 +88,20 @@ ARTHAS_LIB_DIR=${HOME}/.arthas/lib # target process id to attach TARGET_PID= -# target process id to attach -TARGET_IP="127.0.0.1" +# target process id to attach, default 127.0.0.1 +TARGET_IP= +DEFAULT_TARGET_IP="127.0.0.1" -# telnet port -TELNET_PORT="3658" +# telnet port, default 3658 +TELNET_PORT= +DEFAULT_TELNET_PORT="3658" -# http port -HTTP_PORT="8563" +# http port, default 8563 +HTTP_PORT= +DEFAULT_HTTP_PORT="8563" # telnet session timeout seconds, default 1800 -SESSION_TIMEOUT=1800 +SESSION_TIMEOUT= # use specify version USE_VERSION= @@ -139,6 +142,9 @@ AGENT_ID= # stat report url STAT_URL= +# app name +APP_NAME= + ############ Command Arguments ############ # if arguments contains -c/--command or -f/--batch-file, BATCH_MODE will be true @@ -393,6 +399,7 @@ Usage: $0 [-h] [--target-ip ] [--telnet-port ] [--http-port ] [--session-timeout ] [--arthas-home ] [--tunnel-server ] [--agent-id ] [--stat-url ] + [--app-name ] [--use-version ] [--repo-mirror ] [--versions] [--use-http] [--attach-only] [-c ] [-f ] [-v] [pid] @@ -412,6 +419,7 @@ Options and Arguments: --debug-attach Debug attach agent --tunnel-server Remote tunnel server url --agent-id Special agent id + --app-name Special app name --select select target process by classname or JARfilename -c,--command Command to execute, multiple commands separated by ; @@ -425,12 +433,12 @@ EXAMPLES: ./as.sh ./as.sh --target-ip 0.0.0.0 ./as.sh --telnet-port 9999 --http-port -1 - ./as.sh --tunnel-server 'ws://192.168.10.11:7777/ws' + ./as.sh --tunnel-server 'ws://192.168.10.11:7777/ws' --app-name demoapp ./as.sh --tunnel-server 'ws://192.168.10.11:7777/ws' --agent-id bvDOe8XbTM2pQWjF4cfw ./as.sh --stat-url 'http://192.168.10.11:8080/api/stat' ./as.sh -c 'sysprop; thread' ./as.sh -f batch.as - ./as.sh --use-version 3.3.9 + ./as.sh --use-version 3.4.4 ./as.sh --session-timeout 3600 ./as.sh --attach-only ./as.sh --select arthas-demo @@ -461,6 +469,33 @@ find_listen_port_process() fi } +getTargetIPOrDefault() +{ + local targetIP=${DEFAULT_TARGET_IP} + if [ "${TARGET_IP}" ]; then + targetIP=${TARGET_IP} + fi + echo $targetIP +} + +getTelnetPortOrDefault() +{ + local telnetPort=${DEFAULT_TELNET_PORT} + if [ "${TELNET_PORT}" ]; then + telnetPort=${TELNET_PORT} + fi + echo $telnetPort +} + +getHttpPortOrDefault() +{ + local httpPort=${DEFAULT_HTTP_PORT} + if [ "${HTTP_PORT}" ]; then + httpPort=${HTTP_PORT} + fi + echo $httpPort +} + # Status from com.taobao.arthas.client.TelnetConsole # Execute commands timeout STATUS_EXEC_TIMEOUT=100 @@ -479,8 +514,8 @@ find_listen_port_process_by_client() "${JAVA_HOME}/bin/java" ${ARTHAS_OPTS} ${JVM_OPTS} \ -jar "${arthas_lib_dir}/arthas-client.jar" \ - ${TARGET_IP} \ - ${TELNET_PORT} \ + $(getTargetIPOrDefault) \ + $(getTelnetPortOrDefault) \ -c "session" \ --execution-timeout 2000 \ 2>&1 @@ -567,6 +602,11 @@ parse_arguments() shift # past argument shift # past value ;; + --app-name) + APP_NAME="$2" + shift # past argument + shift # past value + ;; --use-http) USE_HTTP=true shift # past argument @@ -637,16 +677,18 @@ parse_arguments() # check telnet port/http port local telnetPortPid local httpPortPid - if [[ $TELNET_PORT > 0 ]]; then - telnetPortPid=$(find_listen_port_process $TELNET_PORT) + local telnetPortOrDefault=$(getTelnetPortOrDefault) + local httpPortOrDefault=$(getHttpPortOrDefault) + if [[ $telnetPortOrDefault > 0 ]]; then + telnetPortPid=$(find_listen_port_process $telnetPortOrDefault) if [ $telnetPortPid ]; then - echo "[INFO] Process $telnetPortPid already using port $TELNET_PORT" + echo "[INFO] Process $telnetPortPid already using port $telnetPortOrDefault" fi fi - if [[ $HTTP_PORT > 0 ]]; then - httpPortPid=$(find_listen_port_process $HTTP_PORT) + if [[ $httpPortOrDefault > 0 ]]; then + httpPortPid=$(find_listen_port_process $httpPortOrDefault) if [ $telnetPortPid ]; then - echo "[INFO] Process $httpPortPid already using port $HTTP_PORT" + echo "[INFO] Process $httpPortPid already using port $httpPortOrDefault" fi fi @@ -717,7 +759,7 @@ parse_arguments() exit 1 fi if [[ ($httpPortPid) && ($TARGET_PID != $httpPortPid) ]]; then - echo "Target process $TARGET_PID is not the process using port $HTTP_PORT, you will connect to an unexpected process." + echo "Target process $TARGET_PID is not the process using port $(getHttpPortOrDefault), you will connect to an unexpected process." echo "1. Try to restart as.sh, select process $httpPortPid, shutdown it first with running the 'stop' command." echo "2. Try to use different http port, for example: as.sh --telnet-port 9998 --http-port 9999" exit 1 @@ -759,14 +801,32 @@ attach_jvm() tempArgs+=("${STAT_URL}") fi + if [ "${APP_NAME}" ]; then + tempArgs+=("-app-name") + tempArgs+=("${APP_NAME}") + fi + + if [ "${TARGET_IP}" ]; then + tempArgs+=("-target-ip") + tempArgs+=("${TARGET_IP}") + fi + if [ "${TELNET_PORT}" ]; then + tempArgs+=("-telnet-port") + tempArgs+=("${TELNET_PORT}") + fi + if [ "${HTTP_PORT}" ]; then + tempArgs+=("-http-port") + tempArgs+=("${HTTP_PORT}") + fi + if [ "${SESSION_TIMEOUT}" ]; then + tempArgs+=("-session-timeout") + tempArgs+=("${SESSION_TIMEOUT}") + fi + "${java_command[@]}" \ ${ARTHAS_OPTS} ${JVM_OPTS} \ -jar "${arthas_lib_dir}/arthas-core.jar" \ -pid ${TARGET_PID} \ - -target-ip ${TARGET_IP} \ - -telnet-port ${TELNET_PORT} \ - -http-port ${HTTP_PORT} \ - -session-timeout ${SESSION_TIMEOUT} \ "${tempArgs[@]}" \ -core "${arthas_lib_dir}/arthas-core.jar" \ -agent "${arthas_lib_dir}/arthas-agent.jar" @@ -811,7 +871,7 @@ sanity_check() { } port_pid_check() { - if [[ $TELNET_PORT > 0 ]]; then + if [[ $(getTelnetPortOrDefault) > 0 ]]; then local telnet_output local find_process_status # declare local var before var=$() @@ -844,15 +904,15 @@ port_pid_check() { } print_telnet_port_pid_error() { - echo "[ERROR] The telnet port $TELNET_PORT is used by process $telnetPortPid instead of target process $TARGET_PID, you will connect to an unexpected process." + echo "[ERROR] The telnet port $(getTelnetPortOrDefault) is used by process $telnetPortPid instead of target process $TARGET_PID, you will connect to an unexpected process." echo "[ERROR] 1. Try to restart as.sh, select process $telnetPortPid, shutdown it first with running the 'stop' command." - echo "[ERROR] 2. Try to stop the existing arthas instance: java -jar arthas-client.jar 127.0.0.1 $TELNET_PORT -c \"stop\"" + echo "[ERROR] 2. Try to stop the existing arthas instance: java -jar arthas-client.jar 127.0.0.1 $(getTelnetPortOrDefault) -c \"stop\"" echo "[ERROR] 3. Try to use different telnet port, for example: as.sh --telnet-port 9998 --http-port -1" } print_telnet_port_used_error() { local error_msg=$1 - echo "[ERROR] The telnet port $TELNET_PORT is used, but process $error_msg, you will connect to an unexpected process." + echo "[ERROR] The telnet port $(getTelnetPortOrDefault) is used, but process $error_msg, you will connect to an unexpected process." echo "[ERROR] Try to use different telnet port, for example: as.sh --telnet-port 9998 --http-port -1" } @@ -881,16 +941,16 @@ active_console() if [ "${COMMAND}" ] ; then "${JAVA_HOME}/bin/java" ${ARTHAS_OPTS} ${JVM_OPTS} \ -jar "${arthas_lib_dir}/arthas-client.jar" \ - ${TARGET_IP} \ - ${TELNET_PORT} \ + $(getTargetIPOrDefault) \ + $(getTelnetPortOrDefault) \ "${tempArgs[@]}" \ -c "${COMMAND}" fi if [ "${BATCH_FILE}" ] ; then "${JAVA_HOME}/bin/java" ${ARTHAS_OPTS} ${JVM_OPTS} \ -jar "${arthas_lib_dir}/arthas-client.jar" \ - ${TARGET_IP} \ - ${TELNET_PORT} \ + $(getTargetIPOrDefault) \ + $(getTelnetPortOrDefault) \ "${tempArgs[@]}" \ -f ${BATCH_FILE} fi @@ -899,12 +959,12 @@ active_console() if [[ $(command -v telnet) == *"system32"* ]] ; then # Windows/system32/telnet.exe can not run in Cygwin/MinGw echo "It seems that current bash is under Windows. $(command -v telnet) can not run under bash." - echo "Please start cmd.exe from Windows start menu, and then run telnet ${TARGET_IP} ${TELNET_PORT} to connect to target process." - echo "Or visit http://127.0.0.1:${HTTP_PORT} to connect to target process." + echo "Please start cmd.exe from Windows start menu, and then run telnet $(getTargetIPOrDefault) $(getTelnetPortOrDefault) to connect to target process." + echo "Or visit http://127.0.0.1:$(getHttpPortOrDefault) to connect to target process." return 1 fi echo "telnet connecting to arthas server... current timestamp is `date +%s`" - telnet ${TARGET_IP} ${TELNET_PORT} + telnet $(getTargetIPOrDefault) $(getTelnetPortOrDefault) else echo "'telnet' is required." 1>&2 return 1