私は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]'