한 프로세스에서 다른 프로세스로 파이프 된 바이트 수


17

한 프로세스에서 다른 프로세스로 데이터를 파이프하는 쉘 스크립트를 실행 중입니다.

process_a | process_b

누구든지 두 프로그램 사이에 몇 바이트가 전달되었는지 알아내는 방법을 알고 있습니까? 내가 지금 생각할 수있는 유일한 해결책은 stdin에서 읽고 stdout에 쓰고 전송 된 모든 데이터를 세고 환경 변수에 카운트를 저장하는 작은 c 프로그램을 작성하는 것입니다.

process_a | count_bytes | process_b

누구든지 깔끔한 솔루션을 가지고 있습니까?

답변:


16

dd를 통해 파이프. dd의 기본 입력은 stdin이고 기본 출력은 stdout입니다. stdin / stdout I / O가 완료되면 전송 된 데이터 양에 대해 stderr에보고합니다.

dd의 출력을 캡처하고 다른 프로그램이 이미 stderr와 통신하려면 다른 파일 디스크립터를 사용하십시오. 예 :

$ exec 4>~/fred
$ input-command | dd 2>&4 | output-command
$ exec 4>&-

2
를 건너 뛰고 exec파일로 직접 출력 할 수 없습니까? input-command | dd 2>~/fred | output-command
추후 공지가있을 때까지 일시 중지되었습니다.

2
예 분명히 "그들"순간 중 하나를 겪고있었습니다. 죄송합니다.
Phil P

28

파이프 뷰어 pv를 사용하십시오 . 훌륭한 도구입니다. 일단 당신이 그것에 대해 알면 당신은 그것없이 어떻게 살았는지 결코 알 수 없습니다.

또한 진행률 표시 줄과 전송 속도를 표시 할 수 있습니다.


내 검색에서 나는 이것을 가로 질러 왔지만 다른 프로세스에서 사용할 수 있도록 전송 된 바이트 수로 변수를 설정해야합니다.
Simon Hodgson

사용 예 : cat file | pv -b파일 크기를 반환합니다.
rodorgas

6

process_a | tee >(process_b) | wc --bytes작동 할 수 있습니다. 그런 다음 wc의 수를 필요한 곳으로 리디렉션 할 수 있습니다 . 경우 process_b에 출력 아무것도 stdout/ stderr당신은 아마 만, 어딘가이 리디렉션해야합니다 /dev/null.

약간 고안된 예 :

filestore:~# cat document.odt | tee >(dd of=/dev/null 2>/dev/null) | wc --bytes
4295

설명을 tee통해 : 출력을 여러 파일 (+ stdout)로 보낼 수 있으며 >()구성은 bash의 "프로세스 대체"입니다.이 경우 프로세스는 쓰기 전용 파일처럼 보이기 때문에 파일뿐만 아니라 프로세스로 리디렉션 할 수 있습니다 ( 여러 프로세스에 출력을 보내는 데 사용하는 예는 여기 또는 이 질문 + 답 을 참조 하십시오tee .


슬프게도 (BusyBox)를 사용하는 shelll은> () 표기법을 지원하지 않는 것처럼 보이지만이 솔루션을 좋아합니다.
Simon Hodgson

Aye, 당신은 그 기능을 갖기 위해서는 꽤 완벽한 bash가 필요합니다-그것은 일반적으로 사용되지 않는 일종의 것입니다. 공간을 절약하기 위해 busybox와 같은.
David Spillett

1

나는 파티에 늦었다는 것을 알고 있지만이 유용한 스레드를 향상시킬 수있는 좋은 대답이 있다고 생각합니다.
이것은 @Phil P와 @David Spillett 답변의 혼합이지만 다음과 같습니다.

  • @Phil P와 달리 새 파일을 만들지 않습니다.
  • @David Spillett와 달리 파이프 라인 구조를 유지합니다.

바이트 수는 process_b의 출력과 함께 stdout에 인쇄됩니다.
접두사를 사용하여 출력으로 작업 할 때 바이트를 포함하는 행을 식별 할 수 있습니다 ( Bytes:예제에서).

exec 3>&1
process_a | tee >({ echo -n 'Bytes:'; wc -c; } >&3) | process_b
exec 3>&-

경고 :
출력에서 행 순서에 의존하지 마십시오
. 순서는 예측할 수 없으며 동일한 매개 변수로 동일한 스크립트를 호출 할 때도 항상 다를 수 있습니다!


슬프게도, 그것은 여전히 ​​배쉬 전용 구조입니다 ...
Mikhail T.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.