Bash(또는 다른 쉘) 스크립트에 정의된 파이프의 파이프 용량을 설정하는 방법이 있습니까? 예를 들면
cmd1 | cmd2
최근 Linux에서는 파이프 크기가 기본적으로 64KB로 설정되어 있습니다. 두 프로세스 간에 "버퍼링되는" 데이터의 양을 제어할 수 있는 두 가지 방법이 있다는 것을 알고 있습니다.
- 용도
buffer(1)
: 예:cmd1 | buffer | cmd2
fcntl(2)
F_SETPIPE_SZ
내부cmd1
또는 외부 표지판 과 함께 사용cmd2
각 솔루션에는 단점이 있습니다. buffer
버퍼를 늘리는 데에만 사용할 수 있으며 기본 파이프 용량에 쓰기에는 여전히 다운스트림 명령을 깨워야 합니다. 내가 아는 한, 또는 fcntl
내부에서만 호출할 수 있습니다 .cmd1
cmd2
내 질문은: 쉘이 파이프를 생성할 때 파이프에 어떤 용량이 있어야 하는지 쉘에서 지정하는 방법이 있습니까?
답변1
기본 파이프 용량에 쓰려면 여전히 다운스트림 명령을 깨워야 합니다.
다운스트림 명령을 너무 자주 깨우지 않는 것이 목표인 경우 이 -p
옵션을 사용해 보셨나요 buffer
? buffer
버퍼가 특정 비율로 채워질 때까지 쓰기가 유지 됩니다 . -s
큰 덩어리로 쓰려면 이 옵션이 필요할 수도 있습니다 .
업데이트: 아, 명령 사이의 파이핑은 여전히 몇 가지 사항을 제한합니다. 아마도 다음 어댑터 프로그램을 사용해 보십시오:
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char** argv)
{
fcntl(atoi(argv[1]), F_SETPIPE_SZ, atoi(argv[2]));
execvp(argv[3],argv+3);
while (1);
}
좋다:
adapter 1 (BIGSIZE) cmd1 | cmd2
심지어:
adapter 1 (BIGSIZE) cmd1 | adapter 1 (BIGSIZE) buffer [args] | cmd2
cmd1
여전히 작은 쓰기가 이루어지는 경우 .
답변2
DepressedDaniel과 Stéphane Chazelas의 조언에 따라 저는 한 줄의 내용에 가장 가까운 것을 선택했습니다.
function hugepipe {
perl -MFcntl -e 'fcntl(STDOUT, 1031, 1048576) or die $!; exec { $ARGV[0] } @ARGV or die $!' "$@"
}
이를 통해 다음 작업이 가능합니다:
hugepipe <command> | <command>
두 명령 사이의 파이프는 fcntl
perl 스크립트에서 지정한 용량을 갖습니다.