타임 아웃, 파단 파이프 및 화장실


20

감압 프로그램을 빠르게 벤치마킹 할 생각이있었습니다. 예를 들어 gz의 경우 다음 명령을 실행합니다.

timeout 10 zcat foo.gz | wc -c

압축 해제 기가 10 초 안에 추출 할 수있는 데이터의 양을 측정합니다.

유일한 문제는 작동하지 않는다는 것입니다 .zcat이 종료되면 wc도 종료되므로 바이트 수를 얻지 못하고 Terminated메시지 만 있습니다.

따라서 질문은 : 어떻게 든 신호를 차단하여 wc에서 카운트를 얻는 방법이 있습니까? 또는 wc 대신 대안 신호를 사용하여 용어 신호를 얻을 때도 결과를 인쇄하는 방법이 있습니까?


물론 대안이 있습니다.

  1. 임시 파일에 쓰기 : 이것
    timeout 10 zcat foo.gz > /dev/shm/x ; du -sb /dev/shm/x ; rm -r /dev/shm/x 의 문제점은 많은 메모리를 사용하고 성능에 약간의 불이익이있을 수 있다는 것입니다.

  2. 대신 ulimit 사용 :
    ulimit -t 10; zcat foo.gz | wc -c
    작동하지만 CPU 시간 만 측정하므로 I / O로 인한 속도 저하 (예 : 압축이 나 빠지고 디스크에서 더 많은 바이트를 읽어야 함)가 측정되지 않습니다.

  3. 더 작은 테스트 파일 만들기 :
    물론 이것은 효과가 있으며 가장 좋은 해결책이 될 수 있습니다. 그러나 이로 인해 많은 임시 파일이 생성됩니다.


6
"파이프 및 화장실 끊기"를 읽으면서 처음에는 배관에 문제가 있다고 생각했습니다!
dr01

답변:


21

서브 쉘에 timeout 명령을 넣고 성공시킬 수 있습니다.

( timeout 10 <command> || true ) | wc -c

3
실패한 명령을 작성 하시겠습니까? D : 아,이 모습 악 그래서
Erathiel

17
@Erathiel 악한 동안 웃고 싶어? 이것을 시도해보십시오 (위와 동일) :(timeout 10 <command> || :) | wc -c
Marco

1
서브 쉘을 사용해 보았지만 성공할 생각은하지 않았습니다. 우수한!
P.Peter

2

게시 직후, 프로세스에 명명 된 파이프를 사용하려고 생각했습니다.

mkfifo /tmp/x; wc -c /tmp/x & timeout 10 zcat foo.gz > /tmp/x &

이것은 작동하는 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.