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" | script
EOF
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
케이스 투 더StartupItems
Mac 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
'source' 카테고리의 다른 글
2차원 어레이를 기반으로 WPF 그리드를 채우는 방법 (0) | 2023.04.12 |
---|---|
iOS UIView 컨트롤러의 라이프 사이클을 이해하려고 합니다. (0) | 2023.04.12 |
WPF에서의 바인딩을 위한 내부 제어 속성 노출 (0) | 2023.04.12 |
여러 개의 수식 키를 사용한WPF에서의 KeyBinding 작성 (0) | 2023.04.12 |
C#을 사용하여 Excel 파일의 데이터를 읽는 방법 (0) | 2023.04.12 |