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が表示されます。