시간 초과, 파손된 수도관 및 화장실

시간 초과, 파손된 수도관 및 화장실

몇몇 스트레스 감소 프로그램을 빠르게 벤치마킹해 보고 싶은 생각이 들었습니다. 예를 들어 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. 더 작은 테스트 파일 만들기:
    이것이 확실히 작동하며 아마도 가장 좋은 솔루션일 것입니다. 그러나 이로 인해 많은 수의 임시 파일이 생성됩니다.

답변1

timeout 명령을 서브셸에 넣고 성공하게 만들 수 있습니다.

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

답변2

게시한 후 프로세스에서 명명된 파이프를 사용하는 방법을 생각했습니다.

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

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

답변3

또한 이 timeout --foreground옵션을 사용하여 시간 초과 시 파이프와 연결된 전체 프로세스 그룹이 아닌 즉각적인 프로세스만 고려하도록 할 수도 있습니다.

관련 정보