我正在与 kafka 合作,我想监控主题。基本上,我将几个主题输出到标准输出并归档以供以后查看。对于单个主题监控,我想出了以下命令:
${KAFKA_HOME}/bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic mytopic | \
while IFS= read -r line; do
printf '[%s | %20s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "mytopic" "${line}";
done | tee -a kafka.out
然而,有很多主题需要消耗,所以我正在尝试做类似的事情
consumer=${KAFKA_HOME}/bin/kafka-console-consumer.sh
mapfile -t topics < <(${KAFKA_HOME}/bin/kafka-topics.sh --zookeeper localhost:2181 --list)
for i in ${topics[@]}; do
xterm -T ${i} -e "my_command" &
done
tail -F kafka.out
my_command
上面的命令在哪里。这不起作用。我怀疑我弄乱了引号,不幸的是我不知道如何正确应用它们
答案1
如果您想逐字存储一些文本,使用以下语法通常会更容易:
mycommand=$(cat << 'EOF'
"${KAFKA_HOME}/bin/kafka-console-consumer.sh" --zookeeper localhost:2181 --topic "$TOPIC" |
while IFS= read -r line; do
printf '[%s | %20s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$TOPIC" "${line}";
done | tee -a kafka.out
EOF
)
在ksh93
,bash
或 中zsh
,您还可以这样做:
mycommand=$(<<'EOF'
....
EOF
其中ksh93
优化了 cat 和 fork 的 exec,而bash
仅优化了 exec(在 中zsh
,没有区别)。
在mksh
:
mycommand=<<'EOF'
...
EOF
进而:
export TOPIC KAFKA_HOME
for TOPIC in "${topics[@]}"; do
xterm -T "$TOPIC" -e "$mycommand" &
done
在这里,我会使用ts
时间戳输入(或者在gawk
或perl
如果ts
不可用时执行),而不是那个效率非常低的while read
循环。
ts '[%F %T | mytopic]'