source

bash 스크립트가 실행 중일 때 출력을 파일로 강제 플러시합니다.

lovecheck 2023. 4. 12. 22:29
반응형

bash 스크립트가 실행 중일 때 출력을 파일로 강제 플러시합니다.

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

/homedir/MyScript &> some_log.log

이 메서드의 문제는 MyScript가 종료된 후에만 some_log.log가 작성된다는 것입니다.실행 중인 프로그램의 출력을 파일로 플러시하여 다음과 같은 작업을 수행할 수 있도록 합니다.

tail -f some_log.log

진척 상황 등을 추적한다.

여기서 해결책을 찾았어요OP의 예를 사용하여 기본적으로 실행하는

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

이데올로기 때문에해서 사용해요.nohup원격 시스템에서 긴 작업을 실행할 수 있습니다.

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

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

script -c <PROGRAM> -f OUTPUT.txt

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

-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

bash 자체는 실제로 로그 파일에 출력을 쓰지 않습니다.대신 스크립트의 일부로 호출되는 명령어는 각각 개별적으로 출력을 쓰고 필요할 때마다 플러시합니다.따라서 bash 스크립트 내의 명령어를 강제적으로 플래시하는 방법은 무엇인지에 따라 달라집니다.

하시면 됩니다.tee이데올로기 때문에

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

은 '이러다'의 bash셸에서는 문제의 파일을 열고 파일 기술자를 스크립트의 표준 출력으로 전달합니다.스크립트에서 현재보다 더 자주 출력이 플러시되도록 해야 합니다.

예를 들어 Perl에서는 다음과 같이 설정할 수 있습니다.

$| = 1;

상세한 것에 대하여는, 참조해 주세요.

이게 도움이 될까요?

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

그러면 stdbuf 유틸리티를 사용하여 access.log에서 원하는 엔트리가 즉시 표시됩니다.

./homedir/MyScript구현되어 있습니다.이 출력이 버퍼링되고 있는 경우는, 실장시에 강제할 필요가 있습니다.경우 fflush를 사용하고,인 경우 fflush합니다.python flush(stdout)는 fflush(stdout)를 사용합니다.

.@user3258569할 수 busybox!

하지만 그 후엔 껍데기가 얼어 붙을 것 같아요.원인을 찾아보니 스크립트 매뉴얼페이지에서 "비인터랙티브셸에서 사용하지 마세요"라는 큰 빨간색 경고가 표시되었습니다.

script는 주로 인터랙티브 단말 세션용으로 설계되어 있습니다. 등).echo foo | script스크립트 세션 내의 인터랙티브셸이 EOF를 놓치기 때문에 세션이 중단될 수 있습니다.script세션을 닫을 타이밍을 알 수 없습니다.자세한 내용은 NOTES 섹션을 참조하십시오.

맞아.script -c "make_hay" -f /dev/null | grep "needle"조개껍데기를 얼리고 있었어요

, 는 그 경고에 반하는 것으로 했다.echo "make_hay" | scriptEOF

echo "make_hay; exit" | script -f /dev/null | grep 'needle'

그리고 그게 효과가 있었어!

man 페이지의 경고를 적어 둡니다.이것은 당신에게 적합하지 않을 수 있습니다.

여기서 문제가 발견된 것은 스크립트에서 실행하는 프로그램이 작업을 완료할 때까지 기다려야 한다는 것입니다.
스크립트에서 백그라운드에서 프로그램을 실행하는 경우 다른 작업을 수행할 수 있습니다.

으로는, 「」에의 입니다.sync를 사용하면 파일시스템 버퍼가 플러시 되어 도움이 됩니다.

스크립트에서 백그라운드에서 일부 프로그램을 시작하는 경우(&스크립트에서 종료할 때까지 기다릴 수 있습니다.아래를 보면 어떻게 기능할 수 있는지 알 수 있습니다.

#!/bin/bash
#... some stuffs ...
program_1 &          # here you start a program 1 in background
PID_PROGRAM_1=${!}   # here you remember its PID
#... some other stuffs ... 
program_2 &          # here you start a program 2 in background
wait ${!}            # You wait it finish not really useful here
#... some other stuffs ... 
daemon_1 &           # We will not wait it will finish
program_3 &          # here you start a program 1 in background
PID_PROGRAM_3=${!}   # here you remember its PID
#... last other stuffs ... 
sync
wait $PID_PROGRAM_1
wait $PID_PROGRAM_3  # program 2 is just ended
# ...

★★wait 및 작업과의 PID입니다.

for job in `jobs -p`
do
   wait $job 
done

더 어려운 것은 백그라운드에서 다른 것을 실행하는 경우입니다.이는 모든 자녀 프로세스가 종료되는 것을 검색하고 기다려야 하기 때문입니다.예를 들어 데몬을 실행하는 경우 :-가 종료되는 것을 기다리는 것은 아닙니다.

주의:

  • wait 은 ""를 의미합니다.여기서 ${!}은 "마지막 백그라운드프로세스가 완료될 때까지 기다립니다"를 의미합니다.$!PID가 되다.말하자면wait ${!}후직 program_2 &는 직접 과 같습니다.program_2, 「」를 사용해 .&

  • 의 도움으로:

    Syntax    
        wait [n ...]
    Key  
        n A process ID or a job specification
    

은 stdbuf이다.awk '{print} END {fflush()}'이걸 할 수 있는 배시가 있었으면 좋겠어요.보통은 필요하지 않지만 이전 버전에서는 파일 기술자에 bash 동기화 버그가 있을 수 있습니다.

X를 하는 Mac 에서 이 했습니다.StartupItems

을 만들면sudo ps aux는 그것을 알 수 .mytool동합니니다다

때으로 인해) OS X가 셧다운되었을 버퍼링으로 인해) 되었습니다.mytool는 출력을 .sed명령어를 입력합니다. 「」를 했을 경우는, 「」를 실행합니다.sudo killall mytool,그리고나서mytool에 출력을 전송합니다.sed명령어를 입력합니다.그 때문에, I는, 「」를 추가했습니다.stop케이스 투 더StartupItemsMac OS X가 종료될 때 실행됩니다.

start)
    if [ -x /sw/sbin/mytool ]; then
      # run the daemon
      ConsoleMessage "Starting mytool"
      (mytool | sed .... >> myfile.txt) & 
    fi
    ;;
stop)
    ConsoleMessage "Killing mytool"
    killall mytool
    ;;

잘 될지는 모르겠지만 전화하는 건 어때?sync?

좋든 싫든 리다이렉션은 이렇게 작동합니다.

이 경우 스크립트의 출력(스크립트가 종료되었음을 의미)이 해당 파일로 리다이렉트됩니다.

이러한 리다이렉션을 스크립트에 추가합니다.

언급URL : https://stackoverflow.com/questions/1429951/force-flushing-of-output-to-a-file-while-bash-script-is-still-running

반응형