[bash] bash 스크립트가 계속 실행되는 동안 출력을 파일로 강제 플러시

다음 명령을 사용하여 crontab에서 매일 호출하는 작은 스크립트가 있습니다.

/homedir/MyScript &> some_log.log

이 방법의 문제점은 myScript가 완료된 후에 만 ​​some_log.log가 생성된다는 것입니다. 프로그램이 실행되는 동안 프로그램의 출력을 파일로 플러시하여 다음과 같은 작업을 수행 할 수 있습니다.

tail -f some_log.log

진행 상황 등을 추적합니다.



답변

bash 자체는 실제로 로그 파일에 출력을 기록하지 않습니다. 대신 스크립트의 일부로 호출하는 명령은 각각 개별적으로 출력을 작성하고 원할 때마다 플러시합니다. 따라서 귀하의 질문은 실제로 bash 스크립트 내에서 명령을 강제로 플러시하는 방법이며, 그것은 그것이 무엇인지에 달려 있습니다.


답변

여기에 대한 해결책을 찾았 습니다 . OP의 예제를 사용하여 기본적으로 실행합니다.

stdbuf -oL /homedir/MyScript &> some_log.log

그런 다음 버퍼는 각 출력 라인 후에 플러시됩니다. 나는 종종 이것을 nohup원격 시스템에서 긴 작업을 실행하기 위해 결합 합니다.

stdbuf -oL nohup /homedir/MyScript &> some_log.log

이렇게하면 로그 아웃 할 때 프로세스가 취소되지 않습니다.


답변

script -c <PROGRAM> -f OUTPUT.txt

키는 -f입니다. 맨 스크립트에서 인용 :

-f, --flush
     Flush output after each write.  This is nice for telecooperation: one person
     does 'mkfifo foo; script -f foo', and another can supervise real-time what is
     being done using 'cat foo'.

백그라운드에서 실행:

nohup script -c <PROGRAM> -f OUTPUT.txt


답변

tee플러시 할 필요없이를 사용하여 파일에 쓸 수 있습니다 .

/homedir/MyScript 2>&1 | tee some_log.log > /dev/null


답변

bash셸이 수행하는 모든 작업은 문제의 파일을 열고 파일 설명자를 스크립트의 표준 출력으로 전달하는 것이므로이 기능은 아닙니다 . 해야 할 일은 현재보다 더 자주 스크립트에서 출력이 플러시되는지 확인 하는 것입니다.

예를 들어 Perl에서는 다음을 설정하여 수행 할 수 있습니다.

$| = 1;

이에 대한 자세한 내용 은 perlvar 를 참조하십시오 .


답변

출력 버퍼링은 프로그램 /homedir/MyScript구현 방법에 따라 다릅니다 . 출력이 버퍼링되는 것을 발견하면 구현에서이를 강제해야합니다. 예를 들어, 파이썬 프로그램 인 경우 sys.stdout.flush ()를 사용하고 C 프로그램 인 경우 fflush (stdout)를 사용합니다.


답변

이것이 도움이 될까요?

tail -f access.log | stdbuf -oL cut -d ' ' -f1 | uniq

그러면 stdbuf 유틸리티를 사용하여 access.log의 고유 항목이 즉시 표시됩니다 .