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" >&2exit 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"# 优先使用xmlstarletif command -v xmlstarlet &> /dev/null; thenlocal 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 0fi# 备用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=1exit 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}')# 特殊处理Metaspaceif [[ "$param" == "MaxMetaspaceSize" ]]; thenif echo "$cmd" | grep -q "UseContainerSupport"; thendefault="auto"elif echo "$cmd" | grep -q "Metaspace"; thendefault="256m"fifiecho "${value:-$default}"
}# 网络接口选择优化(增强兼容性)
get_host_ip() {if command -v ip >/dev/null 2>&1; thenip 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; thenifconfig -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; thenhostname -I | tr " " "," | sed 's/,$//'elseerror "无法获取 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 ] ; thenversion=$( sh $(dirname ${catalina_home})/bin/version.sh |grep "Server version:"|cut -d '/' -f 2 )
# log "$(dirname ${catalina_base})/bin/version.sh is found $version"elseerror "$(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; doversion=$(unzip -p "$jar" META-INF/MANIFEST.MF 2>/dev/null | awk '/Implementation-Version:/ {print $2}' | tr -d '\r')[ -n "$version" ] && echo "$version" && breakdone# 方法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; doversion=$(awk '/^Apache Tomcat Version/{print $4;exit}' "$f" 2>/dev/null)[ -n "$version" ] && echo "$version"doneecho "${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; docollect_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" >&2exit 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"# 优先使用xmlstarletif command -v xmlstarlet &> /dev/null; thenlocal 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 0fi# 备用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=1exit 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}')# 特殊处理Metaspaceif [[ "$param" == "MaxMetaspaceSize" ]]; thenif echo "$cmd" | grep -q "UseContainerSupport"; thendefault="auto"elif echo "$cmd" | grep -q "Metaspace"; thendefault="256m"fifiecho "${value:-$default}"
}# 网络接口选择优化(增强兼容性)
get_host_ip() {if command -v ip >/dev/null 2>&1; thenip 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; thenifconfig -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; thenhostname -I | tr " " "," | sed 's/,$//'elseerror "无法获取 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 ] ; thenversion=$( sh $(dirname ${catalina_home})/bin/version.sh |grep "Server version:"|cut -d '/' -f 2 )
# log "$(dirname ${catalina_base})/bin/version.sh is found $version"elseerror "$(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; doversion=$(unzip -p "$jar" META-INF/MANIFEST.MF 2>/dev/null | awk '/Implementation-Version:/ {print $2}' | tr -d '\r')[ -n "$version" ] && echo "$version" && breakdone# 方法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; doversion=$(awk '/^Apache Tomcat Version/{print $4;exit}' "$f" 2>/dev/null)[ -n "$version" ] && echo "$version"doneecho "${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; docollect_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: