파이프 출력이 시작/종료되는 데 필요한 시간

파이프 출력이 시작/종료되는 데 필요한 시간

디렉터리에 많은 txt 파일이 있습니다.

내가 time wc -l *.txt | head이렇게 하면 시간이 걸린다

real    0m0.032s
user    0m0.020s
sys     0m0.008s

내가 time wc -l *.txt | tail이렇게 하면 시간이 걸린다

real    0m0.156s
user    0m0.076s
sys     0m0.088s

wc이것은 헤드로 파이프되고 있다는 것을 미리 알고 처음 10개 파일만 계산하여 시간을 절약한다는 의미입니까 ? 즉, 파이프에 대해 알고 있습니까? 이것에 특별한 것이 있습니까 wc? 아니면 모든 표준/내장 명령에 적용됩니까?

답변1

나는 strace두 명령 모두에 대해 수행했습니다. 흥미롭게도 출력을 파이프하면 head123개의 시스템 호출만 있습니다. 반면에 tail로 파이핑하는 경우 245개의 시스템 호출이 있습니다(또는 *.txt 파일이 더 많은 경우 그 이상).

케이스: 머리

파이프로 연결될 때 마지막 몇 줄은 다음과 같습니다 head.

open("file12.txt", O_RDONLY)            = 3
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "", 16384)                      = 0
write(1, "0 file12.txt\n", 13)          = -1 EPIPE (Broken pipe)
--- SIGPIPE (Broken pipe) @ 0 (0) ---
+++ killed by SIGPIPE +++

wc12번째 파일의 출력을 쓰려고 하면 오류가 발생합니다 EPIPE. 이것이 head행 11을 얻은 후에 종료되는 이유입니다. 종료 시 위 head의 strace 출력에 표시된 대로 먼저 파이프에 쓰려고 시도하고( 더 이상 읽지 않음) 손상된 파이프 오류를 수신합니다 wc.SIGPIPEwchead

프로세스가 다른 쪽 프로세스에 연결되지 않은 파이프에 쓰기를 시도하면 SIGPIPE 신호가 프로세스로 전송됩니다. - 에서위키피디아

케이스: 꼬리

로 파이프되면 tail위와 유사한 내용이 없습니다. wc는 항상 연결되어야 하는 파이프에 모든 출력을 쓴 tail후 정상적으로 종료됩니다 . tail마지막 10줄을 인쇄하려면 모든 줄이 필요합니다. 또한 읽을 출력이 더 이상 없으면 tail줄을 인쇄하고 정상적으로 종료합니다.

답변2

비차단 프로세스의 출력이 SIGPIPE아무도 읽지 않는 파이프의 쓰기 끝에 도달하면 프로세스가 종료됩니다.

head따라서 입력이 닫히면(즉, 종료되면) 즉시 종료되므로 wc모든 작업을 완료하는 것보다 시간이 덜 걸립니다.

답변3

다음을 수행하여 파일을 사라지게 할 수 있습니다.

time wc -l *.txt > tee   | tail 

그러나 tee 명령에 약간의 시간을 추가했습니다 time.

그리고 tee command:

root@debian:/home/mohsen/test# time wc -l *.txt > tee   | tail 

real    0m0.005s
user    0m0.000s
sys 0m0.000s

아니요 tee command:

root@debian:/home/mohsen/test# time wc -l *.txt | tail 
   8 f3.txt
   7 fi.txt
   5 mydata.txt
   4 newfile.txt
   4 t1.txt
   4 t2.txt
   5 test.txt
   4 text.txt
   0 t.txt
  49 total

real    0m0.004s
user    0m0.000s
sys 0m0.000s

관련 정보