for 루프가 시작된 후 진행 상황을 표시합니다.

for 루프가 시작된 후 진행 상황을 표시합니다.

for대화형 세션에서 루프를 시작합니다 bash. 이 문제의 경우 루프가 다음과 같다고 가정할 수 있습니다.

for i in dir/*; do
    program "$i"
done > log

명령이 예상보다 훨씬 오래 걸렸지만 여전히 실행되었습니다. for현재 실행 중인 루프의 진행 상황을 보는 방법 .

비솔루션:

  • 보다 log.
    다음과 같은 이유로 작동하지 않습니다: program조용히 달릴 것으로 예상됩니다. program검증인 이라고 생각하시면 됩니다 . 아무런 출력 없이 루프가 완료되면 다행입니다.
  • 사이클을 중지하십시오. 일종의 진행 표시기를 추가합니다(예 echo "$i": ). 사이클을 다시 시작하십시오.
    다음과 같은 이유로 작동하지 않습니다:루프는 몇 시간 동안 실행되었습니다. 나는 현재 그것에 투자하고 있는 모든 시간과 에너지를 낭비하고 싶지 않습니다. 나는 모든 것이 괜찮다고 생각합니다. 나는 단지 궁금하고 지금까지 무슨 일이 일어나고 있는지 알고 싶습니다.
  • Ctrl+ Z그럼set -x; fg
    다음과 같은 이유로 작동하지 않습니다: bash사용 시 사이클이 계속되지 않습니다 fg. 루프 내의 현재/다음 명령이 실행될 때까지 루프는 종료되지 않습니다 fg. 직접 시도해 볼 수 있습니다 for i in {1..200}; do printf '%s ' $i; /usr/bin/sleep 0.5; done.

답변1

와일드카드 문자는 dir/*항상 동일한 순서로 확장됩니다. 이 기능은 현재 값과 함께 사용하여 $i진행 정보를 표시할 수 있습니다.

$i현재 값은 시스템에서 실행 중인 프로세스를 확인하여 검색할 수 있습니다. 이것다음 명령현재 실행 중인 인스턴스 program와 해당 매개변수를 인쇄합니다.
여러 프로세스가 있는 경우 확인하려는 루프를 실행하는 셸에서 시작된 프로세스 만 일치시키는 옵션을 program사용할 수 있습니다 .--parent ...pgrepfor

ps -o args= -fp $(pgrep program)

수동으로 값을 추출한 $i다음 다음을 사용하여 진행 상황을 확인하세요.

a=(dir/*)
n=$(printf %s\\0 "${a[@]}" | grep -zFxnm1 'the exact value of $i' | cut -f1 -d:) 
echo "Progress: $n / ${#a[@]}"

이는 두 가지 가정 하에서 작동합니다.

  1. dir/루프가 실행되는 동안 내용은 변경되지 않습니다. program파일이 생성되거나 이름이 바뀌거나 삭제된 경우 번호가 잘못되었을 수 있습니다.

  2. program새로운 프로세스를 시작하기 위해 호출됩니다 . 함수 program인 경우 bash하위 프로세스가 없습니다 program. 함수 function자체가 새 프로세스를 시작하는 다른 프로그램을 호출하는 경우 해당 서브루틴을 찾을 수 있습니다. 그러나 programbash 내장(나열된 명령 사용 help)이거나 순수 bash 함수( bash내장 기능 사용)인 경우 운이 좋지 않습니다.

문제 2가 있거나 for루프의 구조가 질문과 다른 경우(예: 다양한 프로그램이 포함된 매우 긴 루프 본문) 프로세스를 살펴봄으로써 문제를 해결할 program < "$1"수 있습니다 .lsof

관련 정보