헤드/테일로 파이프 출력을 수행하는 데 필요한 시간

헤드/테일로 파이프 출력을 수행하는 데 필요한 시간

디렉토리에 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. 흥미로운 점은 출력을 파이프할 때 head시스템 호출이 123개만 있다는 것입니다. 반면에 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. 그래서 head11번째 줄을 받고 나간 거죠. head종료 하면 wc을 얻습니다 SIGPIPE. 위의 strace 출력에서 ​​볼 수 있듯이 wc먼저 해당 파이프(더 이상 읽지 않는 파이프)에 쓰기를 시도하고 head파이프가 손상되었다는 오류가 발생합니다.

SIGPIPE 신호는 다른 쪽 끝에 연결된 프로세스 없이 파이프에 쓰기를 시도할 때 프로세스로 전송됩니다. -- 에서위키피디아

케이스: 꼬리

로 파이프할 때 tail위와 같은 것은 없습니다. wc는 tail전체 시간 동안 연결되어야 하는 파이프에 모든 출력을 쓴 후 정상적으로 종료됩니다 . tail마지막 10개를 인쇄하려면 모든 줄이 필요합니다. 더 이상 읽을 출력이 없으면 tail줄을 인쇄하고 정상적으로 종료됩니다.

답변2

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

head따라서 입력을 닫 자마자 (즉, 종료) wc모든 작업을 완료하는 것보다 시간이 덜 걸리며 종료됩니다.

답변3

파일을 사라지게 하려면 다음을 수행하십시오.

time wc -l *.txt > tee   | tail 

하지만 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

관련 정보