COlT_CMDB_linux_tomcat_20250505.sh

#!/bin/bash
#IT_BEGIN
#IT_TYPE=3
#IT MIDWARE_TOMCAT_DISCOVERY|discovery.tomcat[disc]
#原型指标
#IT_RULE MIDWARE_TOMCAT_IP|ip[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_Startpid|Start_pid[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_hostname|hostname[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_tomcathome|tomcathome[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_httpsport|httpsport[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_httpport|httpport[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_tomcatlog|tomcatlog[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_workpath|workpath[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_version|version[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_Startuser|Startuser[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_javaversion|javaversion[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_jvmvendor|jvmvendor[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_servicename|servicename[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_Xms|Xms[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_Xmx|Xmx[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_Xss|Xss[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_autodeploy|autodeploy[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_enginename|enginename[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_appbase|appbase[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_docbase|docbase[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_maxconnections|maxconnections[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_conntimeout|conntimeout[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_minthreads|minthreads[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_metaspace|metaspace[{#CATALINA_BASE}]
#IT_RULE MIDWARE_TOMCAT_reloadable|reloadable[{#CATALINA_BASE}]
#IT_END
# 日志函数
log() {
    echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

# 错误处理函数
error() {
    echo "[ERROR] $(date '+%Y-%m-%d %H:%M:%S') - $1" >&2
    exit 1
}
shname=$(basename "$0")
ATTR="_X(g=$shname,p=cmdb,t=script,f=0)"

# 增强型XML解析(兼容异常格式)
parse_xml_attr() {
    local xml_file="$1"
    local xpath="$2"
    local default="$3"
    
    # 优先使用xmlstarlet
    if command -v xmlstarlet &> /dev/null; then
        local value=$(xmlstarlet sel -T -t -m "$xpath" -v . -n "$xml_file" 2>/dev/null | awk 'NR==1{print $0}')
        [ -n "$value" ] && echo "$value" || echo "$default"
        return 0
    fi
    
    # 备用awk解析方案
    awk -v xp="$xpath" -v def="$default" '
    BEGIN { 
        FS="[<>]"; RS=">"
        split(xp, parts, "/")
        tag=parts[length(parts)]
        found=0
    }
    {
        if ($0 ~ "<" tag "[ />]") {
            split($0, attrs, /[<>]/)
            for (i in attrs) {
                if (match(attrs[i], /^ *[^ ]+ +.*/)) {
                    split(substr(attrs[i], RSTART, RLENGTH), pairs, " ")
                    for (j in pairs) {
                        if (index(pairs[j], "=")) {
                            split(pairs[j], kv, "=")
                            gsub(/"/, "", kv[2])
                            print kv[2]
                            found=1
                            exit 0
                        }
                    }
                }
            }
        }
    }
    END {if (!found) print def}' "$xml_file" 2>/dev/null | head -1
}

# 智能JVM参数提取(增强兼容性)
get_jvm_param() {
    local cmd="$1"
    local param="$2"
    local default="$3"
    
    # 匹配模式:支持各种参数格式
    local pattern="(-XX:+Use.*Metaspace)|(-X(m[sx]|ss|mx|mn|ms)[= ]?[^ ]+)|(^| )-${param}([= ]|$)"
    local value=$(echo "$cmd" | grep -Eo "$pattern" | tail -1 | tr '=' ' ' | awk '{print $NF}')

    # 特殊处理Metaspace
    if [[ "$param" == "MaxMetaspaceSize" ]]; then
        if echo "$cmd" | grep -q "UseContainerSupport"; then
            default="auto"
        elif echo "$cmd" | grep -q "Metaspace"; then
            default="256m"
        fi
    fi

    echo "${value:-$default}"
}

# 网络接口选择优化(增强兼容性)
get_host_ip() {
    if command -v ip >/dev/null 2>&1; then
        ip addr show | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}' | cut -d '/' -f 1 | tr "\n" "," | sed 's/,$//'
    elif command -v ifconfig >/dev/null 2>&1; then
        ifconfig -a | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}' | cut -d ':' -f 2 | tr "\n" "," | sed 's/,$//'
    elif command -v hostname >/dev/null 2>&1; then
        hostname -I | tr " " "," | sed 's/,$//'
    else
        error "无法获取 IP 地址:未找到 ifconfig、ip 或 hostname 命令。"
    fi
}

# 增强版本信息采集(新增3种检测方式)
get_tomcat_version() {
    local catalina_home="$1"
    local catalina_base="$2"
    local java_path="$3"
    local version="unknown"
    #方法0: version.sh执行查看是否存在
    if [ -f $(dirname ${catalina_home})/bin/version.sh ] ; then
    version=$( sh $(dirname  ${catalina_home})/bin/version.sh |grep "Server version:"|cut -d '/' -f 2 )
#    log "$(dirname ${catalina_base})/bin/version.sh is  found $version"
   else
    error "$(dirname ${catalina_base})/bin/version.sh is not found $version"
   fi
    # 方法1:检查catalina.sh版本
    [ -f "$(dirname ${catalina_base})/bin/catalina.sh" ] && 
        version=$(awk '/^SERVER_INFO=/ {match($0,/Apache Tomcat\/([0-9.]+)/,a); print a[1]}' "$(dirname ${catalina_base})/bin/catalina.sh" 2>/dev/null)

    # 方法2:检查jar包清单
    [ "$version" = "unknown" ] && find "${catalina_home}/lib" -name "catalina.jar" | head -1 | while read jar; do
        version=$(unzip -p "$jar" META-INF/MANIFEST.MF 2>/dev/null | awk '/Implementation-Version:/ {print $2}' | tr -d '\r')
        [ -n "$version" ] && echo "$version" && break
    done

    # 方法3:类加载方式
    [ "$version" = "unknown" ] && [ -x "$java_path" ] && 
        version=$("$java_path" -cp "${catalina_home}/lib/catalina.jar" org.apache.catalina.util.ServerInfo 2>/dev/null | awk '/Server number:/ {print $3}')
    
    # 方法4:版本文件解析
    [ "$version" = "unknown" ] && find "${catalina_home}" -name "RELEASE-NOTES" | head -1 | while read f; do
        version=$(awk '/^Apache Tomcat Version/{print $4;exit}' "$f" 2>/dev/null)
        [ -n "$version" ] && echo "$version"
    done

    echo "${version:-unknown}"
}

collect_tomcat_metrics() {
    local pid=$1 user=$2 cmd=$3
    
    # 基础信息校验
    local catalina_base=$(readlink -f "/proc/$pid/cwd" 2>/dev/null || echo "/tmp")
    [ ! -d "$catalina_base" ] && return
    
    # 获取安装目录
    #local catalina_home=$(echo "$cmd" | grep -Eo '\-Dcatalina.home=[^ ]+' | cut -d= -f2)
    local catalina_home=$(echo "$cmd" | grep -Eo '\-Dcatalina.home=[^ ]+' | cut -d= -f2|sort -u|grep -vi mail|head -n 1)
    catalina_home=${catalina_home:-$(dirname "$catalina_base")}

    # 获取Java路径
    local java_path=$(awk '{print $1}' <<< "$cmd" | grep -v "^$" || echo "java")

    # 版本信息采集
    local tomcat_version=$(get_tomcat_version "$catalina_home" "$catalina_base" "$java_path")

    # 服务配置解析
    local server_xml="${catalina_base}/conf/server.xml"
    [ -f "$server_xml" ] || server_xml="/dev/null"

    # 端口信息解析
    local http_port=$(parse_xml_attr "$server_xml" "//Connector[contains(@protocol,'HTTP')]/@port" "8080")
    local https_port=$(parse_xml_attr "$server_xml" "//Connector[contains(@scheme,'https')]/@port" "8443")

    # 线程池配置
    local executor_name=$(parse_xml_attr "$server_xml" "//Executor[1]/@name" "default-pool")

    # 输出指标处理
    cat << EOF
ip[$ATTR,$catalina_base]|+|$(get_host_ip)
hostname[$ATTR,$catalina_base]|+|$(hostname -s)
httpport[$ATTR,$catalina_base]|+|${http_port}
httpsport[$ATTR,$catalina_base]|+|${https_port}
tomcathome[$ATTR,$catalina_base]|+|${catalina_home}
tomcatlog[$ATTR,$catalina_base]|+|${catalina_base}/logs/catalina.out
workpath[$ATTR,$catalina_base]|+|${catalina_base}/work
jvmvendor[$ATTR,$catalina_base]|+|$( [[ "$cmd" =~ "openjdk" ]] && echo "OpenJDK" || echo "Oracle" )
Startuser[$ATTR,$catalina_base]|+|${user}
javaversion[$ATTR,$catalina_base]|+|$("$java_path" -version 2>&1 | awk -F'"' '/version/{print $2}')
Xms[$ATTR,$catalina_base]|+|$(get_jvm_param "$cmd" "Xms" "256m")
Xmx[$ATTR,$catalina_base]|+|$(get_jvm_param "$cmd" "Xmx" "512m")
Xss[$ATTR,$catalina_base]|+|$(get_jvm_param "$cmd" "Xss" "1m")
servicename[$ATTR,$catalina_base]|+|$(basename "${catalina_base}")
autodeploy[$ATTR,$catalina_base]|+|$(parse_xml_attr "$server_xml" "//Host/@autoDeploy" "true" | tr 'A-Z' 'a-z')
enginename[$ATTR,$catalina_base]|+|${executor_name}
appbase[$ATTR,$catalina_base]|+|$(parse_xml_attr "$server_xml" "//Host/@appBase" "webapps")
docbase[$ATTR,$catalina_base]|+|$(parse_xml_attr "$server_xml" "//Context/@docBase" "ROOT" | xargs -r basename)
maxconnections[$ATTR,$catalina_base]|+|$(parse_xml_attr "$server_xml" "//Connector/@maxConnections" "10000")
conntimeout[$ATTR,$catalina_base]|+|$(parse_xml_attr "$server_xml" "//Connector/@connectionTimeout" "60000")
minthreads[$ATTR,$catalina_base]|+|$(parse_xml_attr "$server_xml" "//Executor/@minSpareThreads" "10")
metaspace[$ATTR,$catalina_base]|+|$(get_jvm_param "$cmd" "MaxMetaspaceSize" "256m")
reloadable[$ATTR,$catalina_base]|+|$(parse_xml_attr "$server_xml" "//Context/@reloadable" "false" | tr 'A-Z' 'a-z')
version[$ATTR,$catalina_base]|+|${tomcat_version}
EOF
}

# 进程处理优化(兼容容器环境)
tomcat_pids=$(pgrep -f "[o]rg.apache.catalina.startup.Bootstrap" 2>/dev/null | xargs -r ps -o pid,user:15,cmd --no-headers 2>/dev/null)

echo "COL_DETAIL_START:"
[ -n "$tomcat_pids" ] && while IFS= read -r line; do
    collect_tomcat_metrics $(awk '{print $1, $2, substr($0, index($0,$3))}' <<< "$line")
done <<< "$tomcat_pids"
echo "COL_DETAIL_END:"

10.14.1.109服务器执行结果如下:

[root@localhost ~]# sh tomcat_20250505.sh 
COL_DETAIL_START:
ip[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|10.14.1.109
hostname[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|localhost
httpport[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|8080
httpsport[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|8443
tomcathome[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|/home/ntapp/ciomapps/domains
tomcatlog[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|/home/ntapp/ciomapps/domains/cmdb/logs/catalina.out
workpath[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|/home/ntapp/ciomapps/domains/cmdb/work
jvmvendor[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|Oracle
Startuser[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|root
javaversion[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|1.8.0_321
Xms[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|256m
Xmx[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|512m
Xss[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|1m
servicename[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|cmdb
autodeploy[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|true
enginename[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|default-pool
appbase[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|webapps
docbase[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|ROOT
maxconnections[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|10000
conntimeout[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|60000
minthreads[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|10
metaspace[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|256m
reloadable[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|false
version[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/cmdb]|+|9.0.102
ip[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|10.14.1.109
hostname[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|localhost
httpport[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|8080
httpsport[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|8443
tomcathome[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|/home/ntapp/ciomapps/domains
tomcatlog[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|/home/ntapp/ciomapps/domains/quartz/logs/catalina.out
workpath[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|/home/ntapp/ciomapps/domains/quartz/work
jvmvendor[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|Oracle
Startuser[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|root
javaversion[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|1.8.0_321
Xms[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|256m
Xmx[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|512m
Xss[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|1m
servicename[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|quartz
autodeploy[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|true
enginename[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|default-pool
appbase[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|webapps
docbase[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|ROOT
maxconnections[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|10000
conntimeout[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|60000
minthreads[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|10
metaspace[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|256m
reloadable[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|false
version[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/quartz]|+|9.0.102
ip[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|10.14.1.109
hostname[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|localhost
httpport[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|8080
httpsport[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|8443
tomcathome[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|/home/ntapp/ciomapps/domains
tomcatlog[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|/home/ntapp/ciomapps/domains/uccp/logs/catalina.out
workpath[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|/home/ntapp/ciomapps/domains/uccp/work
jvmvendor[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|Oracle
Startuser[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|root
javaversion[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|1.8.0_321
Xms[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|256m
Xmx[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|512m
Xss[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|1m
servicename[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|uccp
autodeploy[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|true
enginename[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|default-pool
appbase[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|webapps
docbase[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|ROOT
maxconnections[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|10000
conntimeout[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|60000
minthreads[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|10
metaspace[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|256m
reloadable[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|false
version[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/uccp]|+|9.0.102
ip[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|10.14.1.109
hostname[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|localhost
httpport[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|8080
httpsport[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|8443
tomcathome[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|/home/ntapp/ciomapps/domains
tomcatlog[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|/home/ntapp/ciomapps/domains/ciom/logs/catalina.out
workpath[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|/home/ntapp/ciomapps/domains/ciom/work
jvmvendor[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|Oracle
Startuser[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|root
javaversion[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|1.8.0_321
Xms[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|256m
Xmx[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|512m
Xss[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|1m
servicename[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|ciom
autodeploy[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|true
enginename[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|default-pool
appbase[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|webapps
docbase[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|ROOT
maxconnections[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|10000
conntimeout[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|60000
minthreads[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|10
metaspace[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|256m
reloadable[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|false
version[_X(g=tomcat_20250505.sh,p=cmdb,t=script,f=0),/home/ntapp/ciomapps/domains/ciom]|+|9.0.102
COL_DETAIL_END:

通过应用目录发现tomcat部署

--------------------修改去掉不必要的指标-----20250505-----

#!/bin/bash
#IT_BEGIN
#IT_TYPE=1
#IT MIDWARE_TOMCAT_IP|ip
#IT MIDWARE_TOMCAT_Startpid|Start_pid
#IT MIDWARE_TOMCAT_hostname|hostname
#IT MIDWARE_TOMCAT_tomcathome|tomcathome
#IT MIDWARE_TOMCAT_httpsport|httpsport
#IT MIDWARE_TOMCAT_httpport|httpport
#IT MIDWARE_TOMCAT_tomcatlog|tomcatlog
#IT MIDWARE_TOMCAT_workpath|workpath
#IT MIDWARE_TOMCAT_version|version
#IT MIDWARE_TOMCAT_Startuser|Startuser
#IT MIDWARE_TOMCAT_servicename|servicename
#IT MIDWARE_TOMCAT_autodeploy|autodeploy
#IT MIDWARE_TOMCAT_enginename|enginename
#IT MIDWARE_TOMCAT_appbase|appbase
#IT MIDWARE_TOMCAT_docbase|docbase
#IT MIDWARE_TOMCAT_maxconnections|maxconnections
#IT MIDWARE_TOMCAT_conntimeout|conntimeout
#IT MIDWARE_TOMCAT_reloadable|reloadable
#IT_END
# 日志函数
log() {
    echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

# 错误处理函数
error() {
    echo "[ERROR] $(date '+%Y-%m-%d %H:%M:%S') - $1" >&2
    exit 1
}
shname=$(basename "$0")
ATTR="_X(g=$shname,p=cmdb,t=script,f=0)"

# 增强型XML解析(兼容异常格式)
parse_xml_attr() {
    local xml_file="$1"
    local xpath="$2"
    local default="$3"
    
    # 优先使用xmlstarlet
    if command -v xmlstarlet &> /dev/null; then
        local value=$(xmlstarlet sel -T -t -m "$xpath" -v . -n "$xml_file" 2>/dev/null | awk 'NR==1{print $0}')
        [ -n "$value" ] && echo "$value" || echo "$default"
        return 0
    fi
    
    # 备用awk解析方案
    awk -v xp="$xpath" -v def="$default" '
    BEGIN { 
        FS="[<>]"; RS=">"
        split(xp, parts, "/")
        tag=parts[length(parts)]
        found=0
    }
    {
        if ($0 ~ "<" tag "[ />]") {
            split($0, attrs, /[<>]/)
            for (i in attrs) {
                if (match(attrs[i], /^ *[^ ]+ +.*/)) {
                    split(substr(attrs[i], RSTART, RLENGTH), pairs, " ")
                    for (j in pairs) {
                        if (index(pairs[j], "=")) {
                            split(pairs[j], kv, "=")
                            gsub(/"/, "", kv[2])
                            print kv[2]
                            found=1
                            exit 0
                        }
                    }
                }
            }
        }
    }
    END {if (!found) print def}' "$xml_file" 2>/dev/null | head -1
}

# 智能JVM参数提取(增强兼容性)
get_jvm_param() {
    local cmd="$1"
    local param="$2"
    local default="$3"
    
    # 匹配模式:支持各种参数格式
    local pattern="(-XX:+Use.*Metaspace)|(-X(m[sx]|ss|mx|mn|ms)[= ]?[^ ]+)|(^| )-${param}([= ]|$)"
    local value=$(echo "$cmd" | grep -Eo "$pattern" | tail -1 | tr '=' ' ' | awk '{print $NF}')

    # 特殊处理Metaspace
    if [[ "$param" == "MaxMetaspaceSize" ]]; then
        if echo "$cmd" | grep -q "UseContainerSupport"; then
            default="auto"
        elif echo "$cmd" | grep -q "Metaspace"; then
            default="256m"
        fi
    fi

    echo "${value:-$default}"
}

# 网络接口选择优化(增强兼容性)
get_host_ip() {
    if command -v ip >/dev/null 2>&1; then
        ip addr show | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}' | cut -d '/' -f 1 | tr "\n" "," | sed 's/,$//'
    elif command -v ifconfig >/dev/null 2>&1; then
        ifconfig -a | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}' | cut -d ':' -f 2 | tr "\n" "," | sed 's/,$//'
    elif command -v hostname >/dev/null 2>&1; then
        hostname -I | tr " " "," | sed 's/,$//'
    else
        error "无法获取 IP 地址:未找到 ifconfig、ip 或 hostname 命令。"
    fi
}

# 增强版本信息采集(新增3种检测方式)
get_tomcat_version() {
    local catalina_home="$1"
    local catalina_base="$2"
    local java_path="$3"
    local version="unknown"
    #方法0: version.sh执行查看是否存在
    if [ -f $(dirname ${catalina_home})/bin/version.sh ] ; then
    version=$( sh $(dirname  ${catalina_home})/bin/version.sh |grep "Server version:"|cut -d '/' -f 2 )
#    log "$(dirname ${catalina_base})/bin/version.sh is  found $version"
   else
    error "$(dirname ${catalina_base})/bin/version.sh is not found $version"
   fi
    # 方法1:检查catalina.sh版本
    [ -f "${catalina_home}/bin/catalina.sh" ] && 
        version=$(awk '/^SERVER_INFO=/ {match($0,/Apache Tomcat\/([0-9.]+)/,a); print a[1]}' "${catalina_home}/bin/catalina.sh" 2>/dev/null)

    # 方法2:检查jar包清单
    [ "$version" = "unknown" ] && find "${catalina_home}/lib" -name "catalina.jar" | head -1 | while read jar; do
        version=$(unzip -p "$jar" META-INF/MANIFEST.MF 2>/dev/null | awk '/Implementation-Version:/ {print $2}' | tr -d '\r')
        [ -n "$version" ] && echo "$version" && break
    done

    # 方法3:类加载方式
    [ "$version" = "unknown" ] && [ -x "$java_path" ] && 
        version=$("$java_path" -cp "${catalina_home}/lib/catalina.jar" org.apache.catalina.util.ServerInfo 2>/dev/null | awk '/Server number:/ {print $3}')
    
    # 方法4:版本文件解析
    [ "$version" = "unknown" ] && find "${catalina_home}" -name "RELEASE-NOTES" | head -1 | while read f; do
        version=$(awk '/^Apache Tomcat Version/{print $4;exit}' "$f" 2>/dev/null)
        [ -n "$version" ] && echo "$version"
    done

    echo "${version:-unknown}"
}

collect_tomcat_metrics() {
    local pid=$1 user=$2 cmd=$3
    
    # 基础信息校验
    local catalina_base=$(readlink -f "/proc/$pid/cwd" 2>/dev/null || echo "/tmp")
    [ ! -d "$catalina_base" ] && return
    
    # 获取安装目录
    local catalina_home=$(echo "$cmd" | grep -Eo '\-Dcatalina.home=[^ ]+' | cut -d= -f2)
    catalina_home=${catalina_home:-$(dirname "$catalina_base")}

    # 获取Java路径
    local java_path=$(awk '{print $1}' <<< "$cmd" | grep -v "^$" || echo "java")

    # 版本信息采集
    local tomcat_version=$(get_tomcat_version "$catalina_home" "$catalina_base" "$java_path")

    # 服务配置解析
    local server_xml="${catalina_base}/conf/server.xml"
    [ -f "$server_xml" ] || server_xml="/dev/null"

    # 端口信息解析
    local http_port=$(parse_xml_attr "$server_xml" "//Connector[contains(@protocol,'HTTP')]/@port" "8080")
    local https_port=$(parse_xml_attr "$server_xml" "//Connector[contains(@scheme,'https')]/@port" "8443")

    # 线程池配置
    local executor_name=$(parse_xml_attr "$server_xml" "//Executor[1]/@name" "default-pool")

    # 输出指标处理
    cat << EOF
ip[$ATTR]|+|$(get_host_ip)
hostname[$ATTR]|+|$(hostname -s)
httpport[$ATTR]|+|${http_port}
httpsport[$ATTR]|+|${https_port}
tomcathome[$ATTR]|+|${catalina_home}
tomcatlog[$ATTR]|+|${catalina_base}/logs/catalina.out
workpath[$ATTR]|+|${catalina_base}/work
Startuser[$ATTR]|+|${user}
servicename[$ATTR]|+|$(basename "${catalina_base}")
autodeploy[$ATTR]|+|$(parse_xml_attr "$server_xml" "//Host/@autoDeploy" "true" | tr 'A-Z' 'a-z')
enginename[$ATTR]|+|${executor_name}
appbase[$ATTR]|+|$(parse_xml_attr "$server_xml" "//Host/@appBase" "webapps")
docbase[$ATTR]|+|$(parse_xml_attr "$server_xml" "//Context/@docBase" "ROOT" | xargs -r basename)
maxconnections[$ATTR]|+|$(parse_xml_attr "$server_xml" "//Connector/@maxConnections" "unknow")
conntimeout[$ATTR]|+|$(parse_xml_attr "$server_xml" "//Connector/@connectionTimeout" "unknow")
reloadable[$ATTR]|+|$(parse_xml_attr "$server_xml" "//Context/@reloadable" "false" | tr 'A-Z' 'a-z')
version[$ATTR]|+|${tomcat_version}
EOF
}

# 进程处理优化(兼容容器环境)
tomcat_pids=$(pgrep -f "[o]rg.apache.catalina.startup.Bootstrap" 2>/dev/null | xargs -r ps -o pid,user:15,cmd --no-headers 2>/dev/null|head -n 1)

echo "COL_DETAIL_START:"
[ -n "$tomcat_pids" ] && while IFS= read -r line; do
    collect_tomcat_metrics $(awk '{print $1, $2, substr($0, index($0,$3))}' <<< "$line")
done <<< "$tomcat_pids"
echo "COL_DETAIL_END:"

10.14.1.109执行结果如下:

[root@localhost ~]# sh COLT_CMDB_linux_tomcat_20250505.sh 
COL_DETAIL_START:
ip[_X(g=COLT_CMDB_linux_tomcat_20250505.sh,p=cmdb,t=script,f=0)]|+|10.14.1.109
hostname[_X(g=COLT_CMDB_linux_tomcat_20250505.sh,p=cmdb,t=script,f=0)]|+|localhost
httpport[_X(g=COLT_CMDB_linux_tomcat_20250505.sh,p=cmdb,t=script,f=0)]|+|8080
httpsport[_X(g=COLT_CMDB_linux_tomcat_20250505.sh,p=cmdb,t=script,f=0)]|+|8443
tomcathome[_X(g=COLT_CMDB_linux_tomcat_20250505.sh,p=cmdb,t=script,f=0)]|+|/home/ntapp/ciomapps/domains
tomcatlog[_X(g=COLT_CMDB_linux_tomcat_20250505.sh,p=cmdb,t=script,f=0)]|+|/home/ntapp/ciomapps/domains/cmdb/logs/catalina.out
workpath[_X(g=COLT_CMDB_linux_tomcat_20250505.sh,p=cmdb,t=script,f=0)]|+|/home/ntapp/ciomapps/domains/cmdb/work
Startuser[_X(g=COLT_CMDB_linux_tomcat_20250505.sh,p=cmdb,t=script,f=0)]|+|root
servicename[_X(g=COLT_CMDB_linux_tomcat_20250505.sh,p=cmdb,t=script,f=0)]|+|cmdb
autodeploy[_X(g=COLT_CMDB_linux_tomcat_20250505.sh,p=cmdb,t=script,f=0)]|+|true
enginename[_X(g=COLT_CMDB_linux_tomcat_20250505.sh,p=cmdb,t=script,f=0)]|+|default-pool
appbase[_X(g=COLT_CMDB_linux_tomcat_20250505.sh,p=cmdb,t=script,f=0)]|+|webapps
docbase[_X(g=COLT_CMDB_linux_tomcat_20250505.sh,p=cmdb,t=script,f=0)]|+|ROOT
maxconnections[_X(g=COLT_CMDB_linux_tomcat_20250505.sh,p=cmdb,t=script,f=0)]|+|unknow
conntimeout[_X(g=COLT_CMDB_linux_tomcat_20250505.sh,p=cmdb,t=script,f=0)]|+|unknow
reloadable[_X(g=COLT_CMDB_linux_tomcat_20250505.sh,p=cmdb,t=script,f=0)]|+|false
version[_X(g=COLT_CMDB_linux_tomcat_20250505.sh,p=cmdb,t=script,f=0)]|+|9.0.102
COL_DETAIL_END:

---------20250506-----------优化版本号获取,通过操作version.sh进行获取

#!/bin/bash
#IT_BEGIN
#IT_TYPE=1
#IT MIDWARE_TOMCAT_IP|ip
#IT MIDWARE_TOMCAT_Startpid|Start_pid
#IT MIDWARE_TOMCAT_hostname|hostname
#IT MIDWARE_TOMCAT_tomcathome|tomcathome
#IT MIDWARE_TOMCAT_httpsport|httpsport
#IT MIDWARE_TOMCAT_httpport|httpport
#IT MIDWARE_TOMCAT_tomcatlog|tomcatlog
#IT MIDWARE_TOMCAT_workpath|workpath
#IT MIDWARE_TOMCAT_version|version
#IT MIDWARE_TOMCAT_Startuser|Startuser
#IT MIDWARE_TOMCAT_servicename|servicename
#IT MIDWARE_TOMCAT_autodeploy|autodeploy
#IT MIDWARE_TOMCAT_enginename|enginename
#IT MIDWARE_TOMCAT_appbase|appbase
#IT MIDWARE_TOMCAT_docbase|docbase
#IT MIDWARE_TOMCAT_maxconnections|maxconnections
#IT MIDWARE_TOMCAT_conntimeout|conntimeout
#IT MIDWARE_TOMCAT_reloadable|reloadable
#IT_END
# 日志函数
log() {
    echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

# 错误处理函数
error() {
    echo "[ERROR] $(date '+%Y-%m-%d %H:%M:%S') - $1" >&2
    exit 1
}
shname=$(basename "$0")
ATTR="_X(g=$shname,p=cmdb,t=script,f=0)"

# 增强型XML解析(兼容异常格式)
parse_xml_attr() {
    local xml_file="$1"
    local xpath="$2"
    local default="$3"
    
    # 优先使用xmlstarlet
    if command -v xmlstarlet &> /dev/null; then
        local value=$(xmlstarlet sel -T -t -m "$xpath" -v . -n "$xml_file" 2>/dev/null | awk 'NR==1{print $0}')
        [ -n "$value" ] && echo "$value" || echo "$default"
        return 0
    fi
    
    # 备用awk解析方案
    awk -v xp="$xpath" -v def="$default" '
    BEGIN { 
        FS="[<>]"; RS=">"
        split(xp, parts, "/")
        tag=parts[length(parts)]
        found=0
    }
    {
        if ($0 ~ "<" tag "[ />]") {
            split($0, attrs, /[<>]/)
            for (i in attrs) {
                if (match(attrs[i], /^ *[^ ]+ +.*/)) {
                    split(substr(attrs[i], RSTART, RLENGTH), pairs, " ")
                    for (j in pairs) {
                        if (index(pairs[j], "=")) {
                            split(pairs[j], kv, "=")
                            gsub(/"/, "", kv[2])
                            print kv[2]
                            found=1
                            exit 0
                        }
                    }
                }
            }
        }
    }
    END {if (!found) print def}' "$xml_file" 2>/dev/null | head -1
}

# 智能JVM参数提取(增强兼容性)
get_jvm_param() {
    local cmd="$1"
    local param="$2"
    local default="$3"
    
    # 匹配模式:支持各种参数格式
    local pattern="(-XX:+Use.*Metaspace)|(-X(m[sx]|ss|mx|mn|ms)[= ]?[^ ]+)|(^| )-${param}([= ]|$)"
    local value=$(echo "$cmd" | grep -Eo "$pattern" | tail -1 | tr '=' ' ' | awk '{print $NF}')

    # 特殊处理Metaspace
    if [[ "$param" == "MaxMetaspaceSize" ]]; then
        if echo "$cmd" | grep -q "UseContainerSupport"; then
            default="auto"
        elif echo "$cmd" | grep -q "Metaspace"; then
            default="256m"
        fi
    fi

    echo "${value:-$default}"
}

# 网络接口选择优化(增强兼容性)
get_host_ip() {
    if command -v ip >/dev/null 2>&1; then
        ip addr show | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}' | cut -d '/' -f 1 | tr "\n" "," | sed 's/,$//'
    elif command -v ifconfig >/dev/null 2>&1; then
        ifconfig -a | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}' | cut -d ':' -f 2 | tr "\n" "," | sed 's/,$//'
    elif command -v hostname >/dev/null 2>&1; then
        hostname -I | tr " " "," | sed 's/,$//'
    else
        error "无法获取 IP 地址:未找到 ifconfig、ip 或 hostname 命令。"
    fi
}

# 增强版本信息采集(新增3种检测方式)
get_tomcat_version() {
    local catalina_home="$1"
    local catalina_base="$2"
    local java_path="$3"
    local version="unknown"
    #log "catalina_base-----${catalina_base}-------------catalina_home--------${catalina_home}"
    
    # 方法0-增强版:动态查找version.sh(兼容自定义安装路径)[1,4](@ref)
    local version_script=$(find "${catalina_home}" "${catalina_base}" /home/ntapp* /usr/local/tomcat* -maxdepth 3 -name version.sh -print -quit 2>/dev/null)
    if [ -f "$version_script" ]; then
        version=$(sh "$version_script" | awk -F'/' '/Server version:/{print $2}' 2>/dev/null)
        [ -n "$version" ] && echo "$version" && return
    fi

    # 方法1-增强版:动态查找catalina.sh并解析[2,4](@ref)
    local catalina_script=$(find "${catalina_home}" "${catalina_base}" /home/ntapp* /usr/local/tomcat* -maxdepth 3 -name catalina.sh -print -quit 2>/dev/null)
    if [ -f "$catalina_script" ]; then
        version=$(awk 'match($0,/Apache Tomcat\/([0-9.]+)/,a){print a[1];exit}' "$catalina_script" 2>/dev/null)
        [ -n "$version" ] && echo "$version" && return
    fi

    # 方法2:检查jar包清单
    [ "$version" = "unknown" ] && find "${catalina_home}" -name "catalina.jar" | head -1 | while read jar; do
        version=$(unzip -p "$jar" META-INF/MANIFEST.MF 2>/dev/null | awk '/Implementation-Version:/ {print $2}' | tr -d '\r')
        [ -n "$version" ] && echo "$version" && break
    done

    # 方法3:类加载方式
    [ "$version" = "unknown" ] && [ -x "$java_path" ] && 
        version=$("$java_path" -cp "${catalina_home}/lib/catalina.jar" org.apache.catalina.util.ServerInfo 2>/dev/null | awk '/Server number:/ {print $3}')
    
    # 方法4:版本文件解析
    [ "$version" = "unknown" ] && find "${catalina_home}" -name "RELEASE-NOTES" | head -1 | while read f; do
        version=$(awk '/^Apache Tomcat Version/{print $4;exit}' "$f" 2>/dev/null)
        [ -n "$version" ] && echo "$version"
    done

    echo "${version:-unknown}"
}

collect_tomcat_metrics() {
    local pid=$1 user=$2 cmd=$3
    
    # 基础信息校验
    local catalina_base=$(readlink -f "/proc/$pid/cwd" 2>/dev/null || echo "/tmp")
    [ ! -d "$catalina_base" ] && return
    
    # 获取安装目录
    local catalina_home=$(echo "$cmd" | grep -Eo '\-Dcatalina.home=[^ ]+' | cut -d= -f2)
    catalina_home=${catalina_home:-$(dirname "$catalina_base")}

    # 获取Java路径
    local java_path=$(awk '{print $1}' <<< "$cmd" | grep -v "^$" || echo "java")

    # 版本信息采集
    local tomcat_version=$(get_tomcat_version "$catalina_home" "$catalina_base" "$java_path")

    # 服务配置解析
    local server_xml="${catalina_base}/conf/server.xml"
    [ -f "$server_xml" ] || server_xml="/dev/null"

    # 端口信息解析
    local http_port=$(parse_xml_attr "$server_xml" "//Connector[contains(@protocol,'HTTP')]/@port" "8080")
    local https_port=$(parse_xml_attr "$server_xml" "//Connector[contains(@scheme,'https')]/@port" "8443")

    # 线程池配置
    local executor_name=$(parse_xml_attr "$server_xml" "//Executor[1]/@name" "default-pool")

    # 输出指标处理
    cat << EOF
ip[$ATTR]|+|$(get_host_ip)
hostname[$ATTR]|+|$(hostname -s)
httpport[$ATTR]|+|${http_port}
httpsport[$ATTR]|+|${https_port}
tomcathome[$ATTR]|+|${catalina_home}
tomcatlog[$ATTR]|+|${catalina_base}/logs/catalina.out
workpath[$ATTR]|+|${catalina_base}/work
Startuser[$ATTR]|+|${user}
servicename[$ATTR]|+|$(basename "${catalina_base}")
autodeploy[$ATTR]|+|$(parse_xml_attr "$server_xml" "//Host/@autoDeploy" "true" | tr 'A-Z' 'a-z')
enginename[$ATTR]|+|${executor_name}
appbase[$ATTR]|+|$(parse_xml_attr "$server_xml" "//Host/@appBase" "webapps")
docbase[$ATTR]|+|$(parse_xml_attr "$server_xml" "//Context/@docBase" "ROOT" | xargs -r basename)
maxconnections[$ATTR]|+|$(parse_xml_attr "$server_xml" "//Connector/@maxConnections" "unknow")
conntimeout[$ATTR]|+|$(parse_xml_attr "$server_xml" "//Connector/@connectionTimeout" "unknow")
reloadable[$ATTR]|+|$(parse_xml_attr "$server_xml" "//Context/@reloadable" "false" | tr 'A-Z' 'a-z')
version[$ATTR]|+|${tomcat_version}
EOF
}

# 进程处理优化(兼容容器环境)
tomcat_pids=$(pgrep -f "[o]rg.apache.catalina.startup.Bootstrap" 2>/dev/null | xargs -r ps -o pid,user:15,cmd --no-headers 2>/dev/null|head -n 1)

echo "COL_DETAIL_START:"
[ -n "$tomcat_pids" ] && while IFS= read -r line; do
    collect_tomcat_metrics $(awk '{print $1, $2, substr($0, index($0,$3))}' <<< "$line")
done <<< "$tomcat_pids"
echo "COL_DETAIL_END:"

10.14.1.109服务器执行结果如下:

[root@localhost ~]# sh tomcat_20250506.sh 
COL_DETAIL_START:
ip[_X(g=tomcat_20250506.sh,p=cmdb,t=script,f=0)]|+|10.14.1.109
hostname[_X(g=tomcat_20250506.sh,p=cmdb,t=script,f=0)]|+|localhost
httpport[_X(g=tomcat_20250506.sh,p=cmdb,t=script,f=0)]|+|8080
httpsport[_X(g=tomcat_20250506.sh,p=cmdb,t=script,f=0)]|+|8443
tomcathome[_X(g=tomcat_20250506.sh,p=cmdb,t=script,f=0)]|+|/home/ntapp/ciomapps/domains
tomcatlog[_X(g=tomcat_20250506.sh,p=cmdb,t=script,f=0)]|+|/home/ntapp/ciomapps/domains/cmdb/logs/catalina.out
workpath[_X(g=tomcat_20250506.sh,p=cmdb,t=script,f=0)]|+|/home/ntapp/ciomapps/domains/cmdb/work
Startuser[_X(g=tomcat_20250506.sh,p=cmdb,t=script,f=0)]|+|root
servicename[_X(g=tomcat_20250506.sh,p=cmdb,t=script,f=0)]|+|cmdb
autodeploy[_X(g=tomcat_20250506.sh,p=cmdb,t=script,f=0)]|+|true
enginename[_X(g=tomcat_20250506.sh,p=cmdb,t=script,f=0)]|+|default-pool
appbase[_X(g=tomcat_20250506.sh,p=cmdb,t=script,f=0)]|+|webapps
docbase[_X(g=tomcat_20250506.sh,p=cmdb,t=script,f=0)]|+|ROOT
maxconnections[_X(g=tomcat_20250506.sh,p=cmdb,t=script,f=0)]|+|unknow
conntimeout[_X(g=tomcat_20250506.sh,p=cmdb,t=script,f=0)]|+|unknow
reloadable[_X(g=tomcat_20250506.sh,p=cmdb,t=script,f=0)]|+|false
version[_X(g=tomcat_20250506.sh,p=cmdb,t=script,f=0)]|+|9.0.102
COL_DETAIL_END:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值