다음과 같이 명령의 출력(터미널에 표시됨)을 로그 파일에 인쇄하는 bash가 있다고 가정해 보겠습니다.
#!/bin/bash
exec 3>&1
exec 1> logfile.log # logfile.log contains all what will be printed in terminal and it will keep updating its content till the script finish it is job
command#1
command#2
command#3
.
.
.
.
.
echo -n "Process is DONE ..."
exec 1>&3
exec 3>&-
이 스크립트를 완료하는 데 몇 분이 걸리는 경우 스크립트에 포함된 명령을 하나씩 실행하여 완료할 수 있습니다.
이 스크립트는 ""logfile.log" 파일에서 프로세스가 완료되었습니다"라는 문장을 찾을 때까지 어떻게 매초 포인트를 인쇄합니까? 아니면 프로세스가 아직 실행 중임을 보여주기 위해 화면에 작업(예: 진행률 표시줄 또는 스크린샷)을 만드시겠습니까?
답변1
내가 보기엔 당신이 사용하고 있는 디자인이 너무 교활한 것 같아요. 다음 디자인을 고려할 수 있습니다.
#!/bin/bash
LOG=logfile.log
#echo $i #what's this for?
exec 3>&1
exec 1> "$LOG" # logfile.log contains all what will be printed in terminal and it will keep updating its content till the script finish it is job
#command1 &
sleep 5 &
sleep 10 &
sleep 15 &
for i in {1..7}; do
echo x
sleep 1
done &
#command2 &
#command3 &
#and so on...
exec 1>&3
exec 3>&-
echo Progress:
while [ $(jobs -pr | wc -l) -gt 0 ] ; do
#jobs
echo -n "."
sleep 1
done
echo -e "\nProcess is DONE ..." | tee -a "$LOG"
몇 가지 설명 줄을 추가했습니다.
- 9-15행은 샘플 명령입니다.
- 24번째 줄은 논리를 보여주기 위해 해시되지 않은 상태로 둘 수 있습니다.
답변2
특정 문자열을 찾아야 합니까, 아니면 프로세스가 끝나면 시청을 중단해도 충분합니까? 간단한 접근 방식은 출력을 다음을 통해 전달하는 것입니다 pv
(매뉴얼 페이지) 진행률 표시줄을 가져오면 tail
마지막에 출력 파일을 확인하여 마지막에 무슨 일이 일어났는지 확인할 수 있습니다.
구성 예:
./process.sh | pv > output.file ; tail -1 output.file
34 B 0:00:02 [16.8 B/s] [ <=> ]
Process done.