교착상태에 빠지기 쉬운 프로그램을 디버깅하고 있습니다. 이러한 경우 제대로 실행되면 출력 복사본이 저장되지만, 이 중 하나를 실행하면 ./program > log
프로그램 교착 상태가 발생하고 (SIGINT)로 종료되면 로그가 항상 비어 있습니다. 나는 프로그램이 표준 출력에 무언가를 썼다는 것을 알고 있습니다. 왜냐하면 이것은 막힐 수 있는 어떤 부분보다 먼저 발생하기 때문입니다. 그리고 실제로 실행하면 터미널에서 출력을 볼 수 있습니다../program | tee log
^C
./program
tee
프로그램을 종료해야 할 경우 지금까지의 출력이 여전히 로그 파일에 저장되도록 출력하는 방법을 원합니다 . 내 쉘은 bash입니다.
답변1
많은(대부분?) 프로그램, 거의 모든 C 또는 C++ 프로그램,"완전한" 버퍼링파이프 또는 디스크 파일이거나 일반적으로 그렇지 않은 경우 stdout isattty()
이며, 여전히 버퍼에 있고 이를 종료할 때 운영 체제로 플러시되지 않은 모든 출력은 손실됩니다. 프로그램은 일반적으로 stderr을 버퍼링하지 않으므로 작동합니다.
일반 용도 stdbuf -oL program ...
또는 가능합니다 -o0
. 일부 프로그램에는 GNU sed 와 같은 자체 개인 옵션이 있습니다 -u/--unbuffered
.
또는 pty에서 프로그램을 실행하는 것을 사용하여 버퍼링을 끄거나 script
단축 형식 screen
인 또는 .expect
unbuffer
ssh -t
자세한 내용과 옵션은 다음을 참조하세요.파이프라인에서 버퍼링 끄기