단어를 찾는 동안 터미널에서 점 인쇄 [닫기]


0

다음과 같이 명령 출력 (터미널에 표시되는 명령)을 로그 파일에 출력하는 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"파일 내에서 "Process is DONE"이라는 문장을 찾을 때까지 1 초마다 점을 인쇄하는 방법은 무엇입니까? 살아 있는?

bash 

@ don_crissti보다 유용하게 만들기 위해 질문을 수정했습니다.

답변:


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를 표시하기 위해 24 행을 해시 할 수 있습니다.

0

해당 문자열을 찾아야합니까, 아니면 프로세스가 끝날 때 시청을 중단하기에 충분합니까? 간단한 방법은 pv( man page )를 통해 출력을 파이프하여 진행률 표시 줄을 얻고 tail마지막에 출력 파일의 끝을 확인하여 마지막에 발생한 일을 확인할 수 있습니다.

구성 예 :

./process.sh  | pv > output.file ; tail -1 output.file 
  34 B 0:00:02 [16.8 B/s] [   <=>                                ]
Process done.

실제로 문자열을 찾는 것은 문제를 해결하려는 시도입니다. 나는 당신의 제안을 시도 할 것입니다

스크립트 내에서 pv를 사용할 수 있습니까?

@goro, mm, 나라면 파이프 라인에서 출력을 후 처리하거나 출력을 리디렉션 할 파일을 선택하는 것이 더 쉽기 때문에 stdout으로 인쇄하는 도구를 선호합니다 (예 : 출력 파일 하드 코딩) 하나는 두 개의 별도 실행을 해야하는 경우 성가시다). 의 경우 pv모든 명령의 출력을 파일로 푸시하는 방법이 필요합니다. 내부 부품에 대해 별도의 스크립트를 작성하거나 서브 쉘에서 실행하는 (cmd1 ; cmd2) | pv > output것이 가장 간단합니다. ( exec파이프 라인으로 리디렉션 할 수 있는지 기억이 안납니다 )
ilkkachu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.