펄 프로그래밍 – PRINT OUT 버퍼링 문제

뭐 어떻게 보면 굳이 문제랄 것까지는 없는 부분입니다만, LOG파일 분석할 때 가장 최근 내용이 때로는 무슨 내용이 있어야 분석하고 말고 할꺼 아니겠어요.

열심히 스크립트를 작성하고, 꼼꼼하게 로그파일까지 만들어지게 해두었는 데 막상 tail -f ‘FILENAME’ 신공으로 로그파일을 좀 보려니, 왠걸 아무것도 들어있지 않는 경우가 발생합니다. 한참을 뒤적거리다가 펄 자체의 버퍼링이 관련이 있다는 것을 발견했습니다.

Suffering from Buffering?

요는, 펄 자체에서 좀 더 효율적으로 메모리 관리를 하기 위해서 바로 바로 쏟아내는 게 아니라 버퍼링 시켜서 조금 모아뒀다가 한번에 쏟아낸다고 하네요. (쏟아낸다는 표현이 껄끄럽긴 하지만)

자세한 내용은 위 사이트를 보시면 되겠고, 다른 건 다 귀찮고 그냥 방법만 알면 된다 하시는 분은 사이트에서 Flushing on Command 항목을 보시면 되겠네요. 표현이 조금 우습지만, 파일 핸들러를 뜨겁게 만들어서 버퍼를 바로 토해내게(!!) 만드는 겁니다!

my $ofh = select OUT;
$| = 1;
print OUT “”;
$| = 0;
select $ofh;

를 통해, print OUT 에 쌓여있던 버퍼를 한번에 뿜어내는 것이죠. 그때 그때 로그 파일이 작성되기 때문에 저한테는 굉장히 유용하네요. 😀