#!/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: