디버그 및 프로세스 정보를 stdout에 출력하는 배치 프로세스가 오래 실행됩니다. 터미널에서 방금 실행하면 '어디에 있는지'를 추적 할 수 있지만 데이터가 너무 많아 져 화면에서 스크롤됩니다.
출력을 파일 '> out.txt'로 리디렉션하면 결국 전체 출력을 얻지 만 버퍼링되므로 더 이상 현재 수행중인 작업을 볼 수 없습니다.
출력을 리디렉션하지만 쓰기를 버퍼링하지 않는 방법이 있습니까?
디버그 및 프로세스 정보를 stdout에 출력하는 배치 프로세스가 오래 실행됩니다. 터미널에서 방금 실행하면 '어디에 있는지'를 추적 할 수 있지만 데이터가 너무 많아 져 화면에서 스크롤됩니다.
출력을 파일 '> out.txt'로 리디렉션하면 결국 전체 출력을 얻지 만 버퍼링되므로 더 이상 현재 수행중인 작업을 볼 수 없습니다.
출력을 리디렉션하지만 쓰기를 버퍼링하지 않는 방법이 있습니까?
답변:
setvbuf
C 에서 호출을 사용하여 표준 스트림의 버퍼링 옵션을 명시 적으로 설정할 수 있지만 ( 이 링크 참조 ) 기존 프로그램의 동작을 수정하려는 경우 stdbuf
( coreutils
버전 7.5 로 시작하는 부분 ).
이것은 stdout
한 줄까지 버퍼링 합니다 :
stdbuf -oL command > output
이렇게하면 stdout
버퍼링이 완전히 비활성화 됩니다.
stdbuf -o0 command > output
./configure && make
요금입니다. 나중에 설치하지 않아도 stdbuf
바이너리 만 사용할 수 있습니다 src/
.
다음 script
과 같은 명령 을 사용하여 파일에 라인 버퍼 출력을 얻을 수 있습니다 .
stty -echo -onlcr # avoid added \r in output
script -q /dev/null batch_process | tee output.log # Mac OS X, FreeBSD
script -q -c "batch_process" /dev/null | tee output.log # Linux
stty echo onlcr
batch_process
을 추가 &
하면 명령이 완료 되지 않고 즉시 종료됩니다 ). 매우 일반적인 사용 사례처럼, b)이 주문이 어떻게 작동하는지에 대한 설명은 없습니다.
내가 찾은 가장 쉬운 솔루션 (설치 된 타사 패키지가 필요하지 않음)은 Unix & Linux 사이트 의 비슷한 스레드에서 언급되었습니다 script
. 명령을 사용하십시오 . 오래되었으며 이미 설치되었을 수 있습니다.
$ script -q /dev/null long_running_command | print_progress # FreeBSD, Mac OS X
$ script -q -c "long_running_command" /dev/null | print_progress # Linux
참고 에 대한 첫 번째 파일 이름 매개 변수 script
명령을 기록하는 로그 파일입니다 . 단순히 script -q your_command
를 실행하면 로그 파일로 실행하도록 들여 쓴 명령을 덮어 씁니다. man script
시도하기 전에 안전을 확인하십시오 .
출력을 파일로 재지 정하고 tail -f
명령으로 파일을 따르십시오 .
편집하다
그래도 버퍼링이 발생하면 syslog 기능을 사용하십시오 (일반적으로 버퍼링되지 않음). 배치 프로세스가 쉘 스크립트로 실행되는 경우 logger 명령을 사용하여이를 수행 할 수 있습니다. 배치 작업이 스크립팅 언어로 실행되는 경우 어쨌든 로깅 기능이 있어야합니다.
This answer is useful
효과가없고 어쩌면 효과가없는 답을 제공 합니까?
tee
마법 만 사용하면됩니다 !
someCommand | tee logFile.log
것입니다 모두 콘솔에 표시하고 로그 파일에 작성합니다.
tee
버퍼링이 발생하는 것을 막지 않습니다.
tee
일부 버퍼링을 피할 수는 없지만 출력이 무엇인지 볼 수만 있습니다. 이것은 @JamesDean이 원했던 것입니다 (나는 그의 질문을 이해하지 못했기 때문에). 버퍼링은 실제로 여기서 문제가되지 않는다고 생각합니다. 자세한 내용이 있으면 알려주십시오.
tee
출력을 얻지 못했지만 출력을 얻지 못하는 것을 더 잘 볼 수 있도록 사용 하는 것이 좋습니다 .
>
하면 콘솔에 아무것도 표시되지 않습니다. @JamesDean이이를 설명하기 위해 "버퍼링"이라는 단어를 사용하고있는 것 같습니다. 나는 그가 원하는 것에 대해 더 많이 말할 수 있도록 그의 질문에 대한 의견을 게시 할 것입니다.