stdout을 파일로 리디렉션할 때 GNU 시간 초과 사용

stdout을 파일로 리디렉션할 때 GNU 시간 초과 사용

실행 파일이 있고 다음과 같이 STDOUT 및 STDERR을 별도의 파일에 기록하려고 한다고 가정해 보겠습니다.

python write.py > out 2> err

이 명령을 GNU와 함께 사용할 때 timeoutout파일은 항상 비어 있습니다. 왜 이런 일이 발생합니까? 이 문제를 어떻게 해결할 수 있나요?

timeout 5s python write.py > out 2> err

write.py 예:

#!/bin/bash
import sys, time

i = 0
while True:    
    print i
    print >> sys.stderr, i
    time.sleep(1)
    i += 1

답변1

$ timeout 5s python write.py > out 2> err
$ ls -l out err
-rw-r--r-- 1 yeti yeti 10 Apr  6 08:12 err
-rw-r--r-- 1 yeti yeti  0 Apr  6 08:12 out
$ timeout 5s python -u write.py > out 2> err
$ ls -l out err
-rw-r--r-- 1 yeti yeti 10 Apr  6 08:13 err
-rw-r--r-- 1 yeti yeti 10 Apr  6 08:13 out
$ cmp err out && echo same
same
$ cat out 
0
1
2
3
4

python에서는 버퍼링된 쓰기를 사용 stdout하지만 에서는 사용하지 마십시오 stderr. 따라서 작성된 모든 내용은 sys.stderr즉시 작성되지만 for의 내용은 sys.stdout쓰기 작업을 최소화하기 위해 버퍼가 가득 찰 때까지 버퍼에 보관됩니다. 5초 이내에 한 번의 쓰기에도 버퍼가 채워지지 않아 인터프리터가 timeout종료됩니다 .python

호출 -u에 옵션을 추가하면 쓰기 도 버퍼링되지 않습니다.pythonstdout

환경 변수를 설정하여 Python 프로그램이 동일한 동작을 수행하도록 강제할 수 있습니다 PYTHONUNBUFFERED. 다른 프로그램의 경우 사용할 수 있습니다unbuffer~에서예상되는패키지 또는stdbuf~에서GNU 핵심 도구(바라보다파이프라인에서 버퍼링 끄기).

관련 정보