kafka-console-producer.sh
次からメッセージを送信します。
#!/bin/bash
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
export KAFKA_HEAP_OPTS="-Xmx512M"
fi
exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleProducer "$@"
次に、Putty端末を介してメッセージを貼り付けます。受信側では、メッセージが約4096バイトに切り捨てられたことを確認しました。 Kafkaのどこにもこの制限はありません。
この制限はbash / terminalまたはPuttyで発生する可能性がありますか?
答え1
4095 は、Linux の tty 行ルールに対する内部エディタの長さの制限です。termios(3)
マニュアルページから:
- 最大行長は4096文字です(終了改行文字を含む)。 4096文字より長い行は切り捨てられます。 4095文字以降は入力処理(ISIGおよびECHO *処理など)が続きますが、4095文字以降のすべての入力データは終了改行文字まで(含まれていない)削除されます。これにより、少なくとも1行を読むことができるまで、端末は常により多くの入力を受け取ることができます。
また見てくださいLinuxカーネルの対応するコード。
たとえば、次のように入力すると:
$wc-cEnter
Enterシェル自体のラインエディタ(bashのreadline)からシェルにラインを送信します。コマンドラインが完了したら、シェルはそれを実行する準備ができているので、独自の行エディタを残して端末デバイスを再仕様(別名)。料理)モード、これはおおよそのラインエディタ(実際にはカーネルのttyドライバで実装されています)を有効にします。
その後、5000バイトの行を貼り付けた場合は、Ctrl+を押してDその行をコミットすると、完了したことを知らせるwc
出力が再び表示されます4095
。
(この制限はbash
独自の行エディタには適用されません。シェルプロンプトでより多くのデータを貼り付けることができることがわかります。bash
)
したがって、受信アプリケーションが標準入力から入力ラインを読み込み、標準入力が端末装置であり、アプリケーションが独自のラインエディタを実装せず(たとえば)入力モードを変更しないbash
場合、ラインは次のものより長くなります。 4096バイト(終了改行文字を含む)は入力できません。
stty -icanon
ただし、受信アプリケーションを起動する前にターミナルデバイスの行エディタ(使用)を無効にすると、入力時に入力内容を直接読み取ることができます。ただし、Backspace/ Ctrl+を使用Wして入力を編集したり、Ctrl+を使用Dして入力を終了したりすることはできません。
次のように入力する場合:
$保存済み= $(stty -g); stty -icanon icrnl;トイレ-c;Enter
5000バイトの長さの行を貼り付けてキーを押すと、Enter5001が表示されます。
答え2
Stéphane Chazelasの答えで述べたように、ターミナルドライバの入力編集バッファのサイズは制限されています。
端末に貼り付けるのではなく、出力をファイルkafka-console-producer.sh
にリダイレクトできます。
kafka-console-producer.sh > kafka.out
次に、ファイルをサーバーにアップロードし、入力を貼り付けるプログラムの入力として使用します。
some-program < kafka.out
答え3
はい、コマンドラインの長さ、より正確には渡される引数の長さに制限がありますexecve
。 「人間の処刑」も参照してください。
昔はこの限度が128kBでした。最新のカーネルでははるかに高いです。
したがって、4096に切り捨てられたのはこれとは何の関係もありません。
実際、コマンドラインは自動的に切り捨てられません。引数が長すぎると、execve
呼び出しは失敗します。
答え4
質問は方法ではなく、なぜ/どこであるかに関するものであるため、トピックから抜け出すことができます。メッセージをファイルに出力し、そのファイルをスクリプトに送信することを示唆する誤った既に投票された回答(質問を読むために急いで生成されます)を現在見つけることができるので、とにかくこの記事を書くように求められました。
Stéphane Chazelasは実際の質問に対する良い答えを提供します。つまり、4095文字+入力長の改行制限は、端末が標準モードで動作する方法に関するハードコードされたLinuxカーネル制限に由来します(端末は通常標準モードにあります)。
具体的な設定でこれをさらに実証するために(How質問に対する回答を提供する)、kafka-console-producer.sh
次のように制限を削除するようにスクリプトを変更できます。
#!/bin/bash
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
export KAFKA_HEAP_OPTS="-Xmx512M"
fi
tty_orig=$(stty -g)
stty -icanon
$(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleProducer "$@"
stty "$tty_orig"
これにより、4095文字で切り捨てることなく、長いメッセージをスクリプトに貼り付けることができます。kafka-console-producer.sh
元のスクリプトがKafkaアプリケーションスイートで提供されていて、編集したくない場合は、元のスクリプトを呼び出すラッパースクリプトを生成することもできます。