tail을 사용하여 실시간으로 파일에 기록되는 내용 보기

tail을 사용하여 실시간으로 파일에 기록되는 내용 보기

천천히 일부 출력을 생성하는 Python 프로그램이 있습니다.

그걸 파일로 담아내고 싶은데, 테일로 라이브로 볼 수도 있겠다는 생각도 들었어요.

그래서 한 터미널에서 나는 다음을 수행하고 있습니다.

python myprog.py > output.txt

그리고 다른 터미널에서 :

tail -f output.txt

하지만 Python 프로그램이 실행되는 동안 꼬리가 나에게 아무것도 표시하지 않는 것 같습니다.

python 스크립트를 종료하기 위해 ctrl-c를 누르면 갑자기 꼬리가 output.txt채워지기 시작합니다. 그러나 Python이 실행되는 동안에는 그렇지 않습니다.

내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변1

생성 시 파이프되도록 버퍼를 명시적으로 플러시해야 할 수도 있습니다. 이는 일반적으로 파이프의 버퍼가 가득 찼을 때(제가 생각하는 킬로바이트 단위) 출력이 stdin 메시지가 끝날 때만 인쇄되기 때문입니다. 이는 아마도 읽기/쓰기를 절약하기 위한 것입니다. 매 인쇄 후에 이 작업을 수행할 수 있으며, 반복하는 경우 루프 내의 마지막 인쇄 후에 수행할 수 있습니다.

import sys
...
print('Some message')
sys.stdout.flush()

답변2

버퍼링되지 않은 플래그를 사용하여 Python을 실행합니다.

python -u myprog.py > output.txt

그러면 출력이 실시간으로 인쇄됩니다.

답변3

라이브 파일을 추적하는 대신 tee대신 사용하십시오. 그것은 당신이 하려는 일을 정확하게 수행하도록 만들어졌습니다.

에서남자 티:

tee(1) - Linux 매뉴얼 페이지

이름 tee - 표준 입력에서 읽고 표준 출력 및 파일에 쓰기

개요

tee [OPTION]... [FILE]...

설명

표준 입력을 각 FILE에 복사하고 표준 출력에도 복사합니다.

-a, --append  
   append to the given FILEs, do not overwrite  
-i, --ignore-interrupts  
   ignore interrupt signals   
--help  
   display this help and exit  
--version
   output version information and exit

FILE이 -이면 표준 출력으로 다시 복사합니다.

따라서 귀하의 경우에는 다음을 실행합니다.

python myprog.py | tee output.txt

편집: 다른 사람들이 지적했듯이 이 답변은 sys.stdout.flush()Davey의 허용 답변에 설명된 대로 Python 프로그램에서 사용되지 않는 한 OP가 원래 겪었던 것과 동일한 문제가 발생합니다. 이 답변을 게시하기 전에 수행한 테스트는 OP의 사용 사례를 정확하게 반영하지 못했습니다.

tee최적은 아니지만 파일에 쓰는 동안 출력을 표시하는 방법으로 여전히 사용할 수 있지만 Davey의 대답은 분명히 정확하고 최선의 대답입니다.

답변4

tail을 사용하면 거의 항상 로그 파일(예: 이메일) 메시지를 추적합니다.

이것은 약간 엉뚱할 수도 있지만 print/ print()/를 사용하는 대신write() 사용하는 대신 로깅 모듈을 사용하는 것은 어떨까요? (PSL에서) 주의: 기존 로그와 관련된 모든 시간과 ID 코드를 출력하지 않도록 로깅 포맷터를 구성할 수 있습니다.

출력은 (데이터) 파일로 이동하도록 구성할 수 있으며 버퍼링 지연이나 리디렉션이 없기 때문에 tail은 원활하고 즉각적으로 작동합니다.

문안 인사

관련 정보