Python 스크립트가 있다고 가정 해 봅시다.script.py
from time import sleep
for i in range(3):
print(i)
sleep(1)
print('done')
다음과 같은 ssh 명령을 통해 원격 서버에서 실행하고 싶습니다.
ssh me@server "python script.py"
0 1 2 done
위의 내용을 그대로 수행하면 스크립트를 시작한 지 3초 후에 전체 출력이 표시됩니다. 대신, 스크립트에 의해 생성된 출력을 즉시 보고 싶습니다. 즉, 0
- 1초 후 - 1
- 1초 후 - 2
- 1초 후 - done
.
로그 파일 보기에 대한 유사한 질문을 본 적이 있지만 이를 수행할 수 있는 쉬운 방법이 있습니까(예: 서버의 파일에 중간 로깅 없이)?
답변1
프로그램이 uinx의 stdout으로 출력을 보낼 때 출력은 일반적으로 I/O 성능을 최적화하기 위해 버퍼링됩니다. 버퍼링 모드는 일반적으로 프로그램이 실행되는 상황에 따라 선택됩니다.
UNIX에서 대화형 세션을 시작할 때 세션은 일반적으로 라인 버퍼링됩니다. 즉, 프로그램이 개행 문자를 출력할 때 버퍼가 플러시됩니다.
프로그램이 파일 컨텍스트(예: stdout은 파일임) 또는 때로는 파이프 컨텍스트에서 시작될 때 일반적으로 블록 버퍼링됩니다. 즉, 블록이 채워질 때까지(보통 8192바이트) 기록되지 않습니다.
프로그램은 필요할 때 표준 출력을 플러시하거나 버퍼링 모드를 직접 변경하여 이 설정을 내부적으로 변경할 수 있습니다. 불행하게도 이에 대한 Python 지원은 열악하거나 존재하지 않습니다.
명령으로 프로그램을 시작하여 외부적으로 버퍼링 모드를 변경할 수 있습니다 stdbuf
.
예를 들어:
ssh me@server "stdbuf -oL python script.py"
원하는 작업을 수행하려면 강제로 라인 버퍼링을 수행해야 합니다.