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/터미널 또는 Putty에서 발생할 수 있습니까?
답변1
4095는 Linux의 tty 줄 규칙에 대한 내부 편집기 길이 제한입니다. termios(3)
매뉴얼 페이지 에서 :
- 최대 줄 길이는 4096자입니다(종료 줄바꿈 문자 포함). 4096자보다 긴 줄은 잘립니다. 4095자 이후에는 입력 처리(예: ISIG 및 ECHO* 처리)가 계속되지만 4095자 이후의 모든 입력 데이터는 종료 개행 문자까지(포함하지 않음) 삭제됩니다. 이렇게 하면 최소한 한 줄을 읽을 수 있을 때까지 터미널이 항상 더 많은 입력을 받을 수 있습니다.
또한보십시오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 애플리케이션 제품군에서 제공되었으며 이를 편집하고 싶지 않은 경우 원본 스크립트를 호출하는 래퍼 스크립트를 생성할 수도 있습니다.