Perl 스크립트를 통해 매초마다 vmstat를 출력하고 각 줄에 타임스탬프를 표시하는 다음 명령줄이 있습니다.
vmstat 15 | /home/Beer/addtimestamp.pl > File_1
addtimestamp.pl의 내용:
!/usr/bin/perl while (<>) { print localtime() . ": $_"; }
그렇다면 출력이 "File_1" 파일로 리디렉션되지 않는 이유는 무엇입니까?
이 작업을 수행하지 않을 때는 훌륭하게 작동하며 아무런 문제 없이 매초 완벽하게 출력을 인쇄합니다.
답변1
당신은 버퍼 트랩에 갇혀있습니다. Perl은 출력을 버퍼링하고 버퍼가 가득 찼을 때만 디스크에 씁니다. 버퍼링은 성능 측면에서는 좋지만 낮은 데이터 속도에서는 혼란스러울 수 있습니다. 충분히 오래 기다리면 파일이 기록되는 것을 확인할 수 있습니다( tail -F File_1
. 표준 버퍼 크기는 4kB라고 생각합니다.
$|=1
Perl에서 버퍼링을 비활성화하려면 다음을 추가하십시오 .
vmstat 1 | perl -e '$| = 1; while (<>) { print localtime() . ": $_"; }' > /tmp/fileetje