如何优化该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
相关产品推荐
相关产品推荐

