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 ...
pgrep
for
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[@]}"
이는 두 가지 가정 하에서 작동합니다.
dir/
루프가 실행되는 동안 내용은 변경되지 않습니다.program
파일이 생성되거나 이름이 바뀌거나 삭제된 경우 번호가 잘못되었을 수 있습니다.program
새로운 프로세스를 시작하기 위해 호출됩니다 . 함수program
인 경우bash
하위 프로세스가 없습니다program
. 함수function
자체가 새 프로세스를 시작하는 다른 프로그램을 호출하는 경우 해당 서브루틴을 찾을 수 있습니다. 그러나program
bash 내장(나열된 명령 사용help
)이거나 순수 bash 함수(bash
내장 기능 사용)인 경우 운이 좋지 않습니다.
문제 2가 있거나 for
루프의 구조가 질문과 다른 경우(예: 다양한 프로그램이 포함된 매우 긴 루프 본문) 프로세스를 살펴봄으로써 문제를 해결할 program < "$1"
수 있습니다 .lsof