COLT_CMDB_linux_zookeeperInfo_20250628.sh

发布于:2025-06-30 ⋅ 阅读:(20) ⋅ 点赞:(0)
#!/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: