파이프라인이 닫힐 때 일찍 종료하는 방법은 무엇입니까?

파이프라인이 닫힐 때 일찍 종료하는 방법은 무엇입니까?

나는 bash 함수로 표현하기에는 너무 복잡한 프로그램을 작성하기 위해 golang을 사용합니다. 프로그램은 표준 입력을 한 줄씩 읽고 수정된 출력을 표준 출력에 씁니다.

stdin 메소드에서 모든 라인을 반복할 때의 문제점은 일찍 종료되지 않는다는 것입니다. 예를 들어 다음 명령은 10줄뿐만 아니라 모든 줄을 처리합니다.

cat largefile | custom-program | head -n 10

기본 Unix 응용 프로그램을 어떻게 조기 종료할 수 있으며 사용자 정의 스크립트에서도 동일한 작업을 수행할 수 있는 방법은 무엇입니까?

답변1

에서는 파이프의 다른 쪽 끝이 닫힌 후( 종료 시) 다음에 라인이 작성될 때 yes | headSIGPIPE 신호에 의해 종료됩니다.yeshead

존재하다:

(seq 20; sleep 10; seq 10) | head

서브쉘과 서브쉘은 처음 20줄을 파이프에 쓴 다음(파이프 버퍼에 맞기 때문에) 문제 없이 10초 동안 절전 모드로 들어갈 수 있습니다. 그 사이에 headwill은 죽었지만 서브쉘이 파이프에 더 많은 줄을 쓸 때만 죽게 됩니다.

반환 후 처음으로 파이프에 쓰는 head대신 명령을 반환 후 즉시 종료하려면 다음을 수행할 수 있습니다.headbash

{ head; kill "$!"; } < <(exec custom-program < large-file)

( bash그래서 프로세스 교체의 pid가 정확히 저장됩니다 $!.)

당신은 또한 볼 수 있습니다일치하는 항목을 찾은 후 Grep이 천천히 종료됩니까?보다 이식성 있는 접근 방식을 원하거나조회 출력을 제한하고 신호 13을 방지합니다.에 적용되는 것의 경우 find.

혹은 그 반대로도이 답변 run_under_watch과 유사한 질문 및 답변 (함수)프로세스가 종료되면표준 입력깨진 파이프가 되십시오.

관련 정보