You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化该bash shell脚本并实现kafka-console-consumer.sh执行时间输出

优化后完整脚本
#!/bin/bash
result=""
# 一次awk处理版本号提取,减少管道层级,修正原变量拼写错误
version=$(ps -ef | awk '/kafka.*[0-9]-sources.jar/ && !/grep/ {match($0, /kafka-([0-9.]+)-sources.jar/, arr); gsub(/\./, "", arr[1]); print arr[1]}')
OUT_FLAG() {
        local check_value=$1
        local result_value=$2
        if [ "${check_value}" -eq 0 ];then
             result="${result}|${result_value}:0"
        else
             result="${result}|${result_value}:1"
        fi
}

get_kafka_home(){
        # 一次ps调用同时判断进程存在、提取kafka_home,减少重复子进程开销
        local kafka_process=$(ps -ef | awk '/kafka\.kafka/ && !/grep/')
        if [ -n "$kafka_process" ];then
          kafka_home=$(echo "$kafka_process" | awk -F '/bin/../libs' '{split($2, arr, ":"); print arr[2]}')
        else
          echo "could not found kafka_home."
          exit 1
        fi
}

consumer(){
        local consumer_mes=0
        TOPIC=$($kafka_home/bin/kafka-topics.sh --zookeeper localhost:2181 --list 2>/dev/null | grep -v "__consumer_offsets" | grep -m 1 "[a-zA-Z]")
        # 新增空topic判断,避免后续命令执行异常
        if [ -z "$TOPIC" ];then
          consumer_mes=1
          result="${result}|consumer_time:0s"
        else
          # 记录consumer命令开始执行时间
          local start_time=$(date +%s.%N)
          # 合并重复逻辑,仅保留差异化参数
          local common_args="--bootstrap-server localhost:9092 --topic $TOPIC --from-beginning --max-messages 1"
          # 转十进制比较,避免前导零带来的八进制语法歧义
          if [ $((10#$version)) -gt 102 ]; then
            timeout -k 3s 3s $kafka_home/bin/kafka-console-consumer.sh $common_args &>/dev/null
          else
            timeout -k 3s 3s $kafka_home/bin/kafka-console-consumer.sh $common_args --new-consumer &>/dev/null
          fi
          consumer_mes=$?
          # 计算执行时长,保留1位小数
          local end_time=$(date +%s.%N)
          local cost_time=$(echo "$end_time - $start_time" | bc 2>/dev/null | awk '{printf "%.1f", $0}')
          [ -z "$cost_time" ] && cost_time=0
          result="${result}|consumer_time:${cost_time}s"
        fi
        OUT_FLAG ${consumer_mes} "consumer"
}

main(){
        get_kafka_home
        # 一次ss调用完成两个端口检查,减少重复系统调用
        local alive_port_num=$(ss -ntupl | grep -E -w '9092|2181' | wc -l)
        # 修复原逻辑错误:只要有一个端口不通就直接退出
        if [ $alive_port_num -lt 2 ];then
          exit 1
        else
          consumer
        fi
        echo "kafka_Check$result"
}

main
核心优化说明
  • 减少冗余子进程:原脚本多次调用ps -ef、ss命令,优化后统一单次获取所需信息,大幅降低系统开销
  • 简化文本处理:合并原多段grep+awk+cut的管道逻辑,减少执行流程层级
  • 修复已知问题:修正原变量vesrion的拼写错误,版本号判断改为十进制比较避免前导零带来的八进制歧义,修复原端口判断逻辑漏洞
  • 移除重复代码:合并consumer分支中重复的命令逻辑,仅保留差异化参数,降低维护成本
计时与输出格式实现逻辑
  • 通过date +%s.%N获取纳秒级时间戳,在kafka-console-consumer.sh执行前后分别记录时间,差值计算后保留1位小数,拼接为要求的consumer_time:Xs格式
  • 调整输出字段名,将原consumer_flag改为consumer,最终输出完全匹配要求的kafka_Check|consumer:0|consumer_time:0.3s格式

内容的提问来源于stack exchange,提问作者Echo_s

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:15:06