실행 파일이 있고 다음과 같이 STDOUT 및 STDERR을 별도의 파일에 기록하려고 한다고 가정해 보겠습니다.
python write.py > out 2> err
이 명령을 GNU와 함께 사용할 때 timeout
내 out
파일은 항상 비어 있습니다. 왜 이런 일이 발생합니까? 이 문제를 어떻게 해결할 수 있나요?
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
에 옵션을 추가하면 쓰기 도 버퍼링되지 않습니다.python
stdout
환경 변수를 설정하여 Python 프로그램이 동일한 동작을 수행하도록 강제할 수 있습니다 PYTHONUNBUFFERED
. 다른 프로그램의 경우 사용할 수 있습니다unbuffer
~에서예상되는패키지 또는stdbuf
~에서GNU 핵심 도구(바라보다파이프라인에서 버퍼링 끄기).