script

script

표시해야 할 것은 주기적으로 로그를 새로 고치는 것입니다. 약 10줄의 텍스트 블록입니다. 나는 |티를 사용하고 있으며 지금은 작동합니다. 다만 성능은 만족스럽지 못합니다. 잠시 기다렸다가 여러 번 새로 고침을 통해 여러 텍스트 블록을 출력합니다(특히 프로그램이 막 시작될 때 콘솔에 아무것도 표시하기 시작하는 데 꽤 시간이 걸리고 처음 이 내용을 봤을 때 프로그램이 중단된 줄 알았습니다). 게다가 마지막 블록 중간에 랜덤하게 깨지기 때문에 선물하기에는 상당히 보기 흉합니다.

이를 개선할 수 있는 방법이 있나요? (매번 출력량이 줄어들고 출력 파일과 콘솔 사이를 더 자주 전환할 수 있을까요?)

업데이트: 현재 내 bash 스크립트에 있는 내용은 다음과 같습니다. tail -f /var/log/syslog | egrep --line-buffered "my search string" > tmp.txt & python script.py | tee result.log

답변1

귀하의 문제는 파이프의 기본 기능, 즉 버퍼링에서 발생한다고 생각합니다.

unbuffer해결 방법은 복잡하지만 or script또는 와 같은 명령을 살펴봐야 합니다 stdbuf.

아마도 다음과 같이 출력 버퍼링을 중지하는 방법이 있을 것입니다.

 your_program | stdbuf -o0 tee

추신. 지금은 콘솔에 있지 않아서 시도해 볼 수 없습니다.

답변2

나는 명령 그룹화를 사용하고 출력을 프로세스 대체으로 리디렉션합니다. 내부에서는 이를 /dev/tty 및 stdout에 에코합니다. 그런 다음 stdout과 stderr을 파일로 리디렉션합니다. 지금까지 나를 위해 작동합니다. 원하는 경우 타임스탬프와 프로세스 식별자를 출력 앞에 쉽게 추가할 수 있습니다.

{
  #script goes here
} > >(while read TEXT ; do MESSAGE="$(date +"%d.%m.%Y") $(date +"%Hh%Mm%Ss") $LOGPREFIX $TEXT"; echo $MESSAGE; echo $MESSAGE > /dev/tty; done >> $LOGFILE) 2>&1 

답변3

script

달리다

$ script -c "your_program" result.log

대신에

$ your_program | tee result.log

예를 들어 script -c "ls" result.log.

참고: 명령 script으로 시작 script result.log 하고 끝나는 전체 bash 세션을 기록할 수 있습니다 exit.

이 답변은 @curious_cat에 이미 포함되어 있으며 이 질문에 대한 동일한 답변입니다.Bash 세션 녹음

관련 정보