#!/bin/bash
#IT_BEGIN
#IT_TYPE=1
#原型指标
#IT MIDWARE_ZK_IP|ip
#IT MIDWARE_ZK_HOSTNAME|hostname
#IT MIDWARE_ZK_PORT|port
#IT MIDWARE_ZK_VERSION|version
#IT MIDWARE_ZK_TICKTIME|tickTime
#IT MIDWARE_ZK_TIMEOUT|Timeout
#IT MIDWARE_ZK_INITLIMIT|initLimit
#IT MIDWARE_ZK_SYNCLIMIT|syncLimit
#IT MIDWARE_ZK_MAXCLIENTCNXNS|maxClientCnxns
#IT MIDWARE_ZK_PURGEINTERVAL|purgeInterval
#IT MIDWARE_ZK_DATADIR|dataDir
#IT MIDWARE_ZK_DATALOGDIR|dataLogDir
#IT MIDWARE_ZK_SNAPSHOTNUM|snapshot
#IT MIDWARE_ZK_CONFFILEDIR|conf
#IT MIDWARE_ZK_BIN|bin
#IT MIDWARE_ZK_ZKSERVERS|zkservers
#IT MIDWARE_ZK_installpath|installpath
#IT_END
shname=`basename $0`
ATTR="_X(g=$shname,p=CMDB,t=script,f=0)"
tmpfile="/tmp/${shname}_${$}.tmp"
# 检查Zookeeper进程是否存在
count=$(ps -eaf | grep -E 'org.apache.zookeeper.server.quorum.QuorumPeerMain|zookeeper.server.ZooKeeperServerMain' | grep -v grep | wc -l)
if [ $count -eq 0 ]; then
exit 0
fi
# 获取第一个Zookeeper进程信息
zk_process=$(ps -eaf | grep -E 'org.apache.zookeeper.server.quorum.QuorumPeerMain|zookeeper.server.ZooKeeperServerMain' | grep -v grep | head -1)
pid=$(echo "$zk_process" | awk '{print $2}')
user=$(echo "$zk_process" | awk '{print $1}')
# 获取安装路径和工作目录
installpath=$(ls -l /proc/$pid/cwd 2>/dev/null | awk '{print $11}')
[ -z "$installpath" ] && installpath="N/A"
# 获取配置文件路径
conf_file=$(echo "$zk_process" | awk '{for(i=1;i<=NF;i++){if($i~/-config.file=/){sub(/-config.file=/,"",$i);print $i}}}')
if [ -z "$conf_file" ]; then
# 尝试从命令行参数中获取配置文件
conf_file=$(echo "$zk_process" | awk '{for(i=1;i<=NF;i++){if($i~/.cfg$/||$i~/.conf$/||$i~/.properties$/){print $i}}}')
# 如果还是找不到,尝试默认路径
if [ -z "$conf_file" ] && [ "$installpath" != "N/A" ]; then
possible_conf_files=(
"$installpath/conf/zoo.cfg"
"$installpath/conf/zookeeper.conf"
"$installpath/zookeeper/conf/zoo.cfg"
"/etc/zookeeper/zoo.cfg"
"/etc/zookeeper/conf/zoo.cfg"
)
for file in "${possible_conf_files[@]}"; do
if [ -f "$file" ]; then
conf_file="$file"
break
fi
done
fi
fi
if [[ $conf_file != /* ]] && [ -n "$conf_file" ] && [ "$installpath" != "N/A" ]; then
conf_file="$installpath/$conf_file"
fi
# 获取IP地址
ip="N/A"
if command -v ip >/dev/null 2>&1; then
ip=$(ip addr show 2>/dev/null | grep -w inet | grep -v 127.0.0.1 | awk '{print $2}' | cut -d '/' -f 1 | head -1)
elif command -v ifconfig >/dev/null 2>&1; then
ip=$(ifconfig -a 2>/dev/null | grep -w inet | grep -v 127.0.0.1 | awk '{print $2}' | cut -d ':' -f 2 | head -1)
fi
[ -z "$ip" ] && ip="N/A"
hostname=$(hostname 2>/dev/null || echo "N/A")
# 初始化所有指标变量
tickTime="N/A"
initLimit="N/A"
syncLimit="N/A"
port="N/A"
maxClientCnxns="N/A"
purgeInterval="N/A"
dataDir="N/A"
dataLogDir="N/A"
zkservers="N/A"
# 解析配置文件 - 专门优化maxClientCnxns的获取
if [ -f "$conf_file" ]; then
# 使用更全面的方式获取配置项
while IFS= read -r line; do
# 跳过注释行和空行
line=$(echo "$line" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
[[ "$line" =~ ^# ]] && continue
[[ -z "$line" ]] && continue
# 处理maxClientCnxns(考虑可能被注释的情况)
if [[ "$line" =~ maxClientCnxns ]]; then
# 去除行尾注释
clean_line=$(echo "$line" | sed 's/#.*$//')
if [[ "$clean_line" =~ maxClientCnxns[[:space:]]*=[[:space:]]*([0-9]+) ]]; then
maxClientCnxns="${BASH_REMATCH[1]}"
fi
fi
# 处理其他配置项
case "$line" in
tickTime=*)
tickTime=$(echo "$line" | cut -d '=' -f 2 | sed 's/[[:space:]]*$//')
;;
initLimit=*)
initLimit=$(echo "$line" | cut -d '=' -f 2 | sed 's/[[:space:]]*$//')
;;
syncLimit=*)
syncLimit=$(echo "$line" | cut -d '=' -f 2 | sed 's/[[:space:]]*$//')
;;
clientPort=*)
port=$(echo "$line" | cut -d '=' -f 2 | sed 's/[[:space:]]*$//')
;;
autopurge.purgeInterval=*)
purgeInterval=$(echo "$line" | cut -d '=' -f 2 | sed 's/[[:space:]]*$//')
;;
dataDir=*)
dataDir=$(echo "$line" | cut -d '=' -f 2 | sed 's/[[:space:]]*$//')
;;
dataLogDir=*)
dataLogDir=$(echo "$line" | cut -d '=' -f 2 | sed 's/[[:space:]]*$//')
;;
esac
done < "$conf_file"
# 处理dataLogDir默认值
[ "$dataLogDir" = "N/A" ] && dataLogDir="$dataDir"
# 获取集群配置
zkservers=$(grep '^server\.' "$conf_file" 2>/dev/null | tr '\n' ',' | sed 's/,$//')
[ -z "$zkservers" ] && zkservers="N/A"
# 处理相对路径
if [[ $dataDir != /* ]] && [ "$dataDir" != "N/A" ] && [ "$installpath" != "N/A" ]; then
dataDir="$installpath/$dataDir"
fi
if [[ $dataLogDir != /* ]] && [ "$dataLogDir" != "N/A" ] && [ "$installpath" != "N/A" ]; then
dataLogDir="$installpath/$dataLogDir"
fi
fi
# 获取版本信息
jar_version="N/A"
if [ "$installpath" != "N/A" ]; then
jar_file=$(find "$installpath" -name "zookeeper-*.jar" 2>/dev/null | head -1)
if [ -n "$jar_file" ]; then
jar_version=$(basename "$jar_file" | sed -E 's/zookeeper-([0-9]+\.[0-9]+\.[0-9]+).*\.jar/\1/')
fi
fi
# 获取快照数量
snapshot="N/A"
if [ "$dataDir" != "N/A" ]; then
snapshot_dir="$dataDir/version-2"
[ ! -d "$snapshot_dir" ] && snapshot_dir="$dataDir"
if [ -d "$snapshot_dir" ]; then
snapshot=$(ls "$snapshot_dir" 2>/dev/null | grep -c -E 'snapshot\.[0-9]+$' || echo "N/A")
fi
fi
# 获取bin目录
bin_dir="N/A"
if [ "$installpath" != "N/A" ]; then
bin_dir=$(find "$installpath" -name "*bin" -type d 2>/dev/null | head -1)
[ -z "$bin_dir" ] && bin_dir="$installpath"
fi
# 计算Timeout
Timeout="N/A"
if [[ "$tickTime" =~ ^[0-9]+$ ]] && [[ "$initLimit" =~ ^[0-9]+$ ]]; then
Timeout=$((tickTime * initLimit))
fi
# 输出结果
echo "COL_DETAIL_START:"
echo "installpath[$ATTR]|+|${installpath:-N/A}"
echo "ip[$ATTR]|+|${ip:-N/A}"
echo "hostname[$ATTR]|+|${hostname:-N/A}"
echo "port[$ATTR]|+|${port:-N/A}"
echo "version[$ATTR]|+|${jar_version:-N/A}"
echo "tickTime[$ATTR]|+|${tickTime:-N/A}"
echo "Timeout[$ATTR]|+|${Timeout:-N/A}"
echo "initLimit[$ATTR]|+|${initLimit:-N/A}"
echo "syncLimit[$ATTR]|+|${syncLimit:-N/A}"
echo "clientPort[$ATTR]|+|${port:-N/A}"
echo "maxClientCnxns[$ATTR]|+|${maxClientCnxns:-N/A}"
echo "purgeInterval[$ATTR]|+|${purgeInterval:-N/A}"
echo "dataDir[$ATTR]|+|${dataDir:-N/A}"
echo "dataLogDir[$ATTR]|+|${dataLogDir:-N/A}"
echo "snapshot[$ATTR]|+|${snapshot:-N/A}"
echo "conf[$ATTR]|+|${conf_file:-N/A}"
echo "bin[$ATTR]|+|${bin_dir:-N/A}"
echo "zkservers[$ATTR]|+|${zkservers:-N/A}"
echo "COL_DETAIL_END:"
# 清理临时文件
[ -f "$tmpfile" ] && rm -f "$tmpfile"
补充默认值设置:zookeeper的默认值未-N/A
10.14.1.5执行结果如下:
[root@hadoopkfk01 ~]# sh COLT_CMDB_agent_linux_zookeeper.sh
COL_DETAIL_START:
installpath[_X(g=COLT_CMDB_agent_linux_zookeeper.sh,p=CMDB,t=script,f=0)]|+|/home/ntciom/zookeeper
ip[_X(g=COLT_CMDB_agent_linux_zookeeper.sh,p=CMDB,t=script,f=0)]|+|10.14.1.5
hostname[_X(g=COLT_CMDB_agent_linux_zookeeper.sh,p=CMDB,t=script,f=0)]|+|hadoopkfk01
port[_X(g=COLT_CMDB_agent_linux_zookeeper.sh,p=CMDB,t=script,f=0)]|+|2181
version[_X(g=COLT_CMDB_agent_linux_zookeeper.sh,p=CMDB,t=script,f=0)]|+|3.6.4
tickTime[_X(g=COLT_CMDB_agent_linux_zookeeper.sh,p=CMDB,t=script,f=0)]|+|2000
Timeout[_X(g=COLT_CMDB_agent_linux_zookeeper.sh,p=CMDB,t=script,f=0)]|+|60000
initLimit[_X(g=COLT_CMDB_agent_linux_zookeeper.sh,p=CMDB,t=script,f=0)]|+|30
syncLimit[_X(g=COLT_CMDB_agent_linux_zookeeper.sh,p=CMDB,t=script,f=0)]|+|30
clientPort[_X(g=COLT_CMDB_agent_linux_zookeeper.sh,p=CMDB,t=script,f=0)]|+|2181
maxClientCnxns[_X(g=COLT_CMDB_agent_linux_zookeeper.sh,p=CMDB,t=script,f=0)]|+|N/A
purgeInterval[_X(g=COLT_CMDB_agent_linux_zookeeper.sh,p=CMDB,t=script,f=0)]|+|N/A
dataDir[_X(g=COLT_CMDB_agent_linux_zookeeper.sh,p=CMDB,t=script,f=0)]|+|/home/ntciom/zookeeper/zk_data_dir
dataLogDir[_X(g=COLT_CMDB_agent_linux_zookeeper.sh,p=CMDB,t=script,f=0)]|+|/home/ntciom/zookeeper/zk_data_dir
snapshot[_X(g=COLT_CMDB_agent_linux_zookeeper.sh,p=CMDB,t=script,f=0)]|+|1
conf[_X(g=COLT_CMDB_agent_linux_zookeeper.sh,p=CMDB,t=script,f=0)]|+|/home/ntciom/zookeeper/apache-zookeeper-3.6.4-bin/bin/../conf/zoo.cfg
bin[_X(g=COLT_CMDB_agent_linux_zookeeper.sh,p=CMDB,t=script,f=0)]|+|/home/ntciom/zookeeper/apache-zookeeper-3.6.4-bin
zkservers[_X(g=COLT_CMDB_agent_linux_zookeeper.sh,p=CMDB,t=script,f=0)]|+|N/A
COL_DETAIL_END: