하나의 하위 프로세스를 제외한 모든 프로세스의 실행이 완료될 때까지 기다리는 방법

하나의 하위 프로세스를 제외한 모든 프로세스의 실행이 완료될 때까지 기다리는 방법

제가 작성 중인 스크립트의 백그라운드에서 일부 프로세스를 시작하고 있습니다. for 루프의 각 반복이 끝나기 전에 이러한 프로세스 중 일부가 완료될 때까지 기다리고 싶지만 독립적으로 실행하고 종료해야 하는 프로세스가 하나 있습니다. 지금 내가 하고 있는 일은 메모리가 부족하고 실행 중인 스크립트를 포함하여 점점 더 많은 프로세스를 희생시키는 것 같기 때문에 작동하지 않습니다. 내가 현재 가지고 있는 것은 다음과 같습니다.

loadAvg &
pid=$!
echo "LA pid $pid"
for (( j=0; j < $units_to_fill; j=$((j+1)) )); do
    #Print all files in dir | shuffle file names | delete 1st 1024 files found
    if [ $from_zero -ne 1 ];then
        stat -c %n * | sort -rz | awk -v n=0 '/file_[0-9]*_[abcd].bin/ { if( ++n <= 1024) {print $1 ; }}' | xargs -r rm -f
    fi
    echo "Creating file $j"
    pids=$(writeFile "file_${j}.bin" $src_file $block_size $block_count "${wd}/${dd_log_file}") #Writes a file of (dd) block size 1MB, with 1024 blocks
    for job in `jobs -p`; do
        if [[ $job -ne $pid ]]; then
            echo "Waiting for $job"             
            wait $job
        fi
    done
done
kill $pid

이 함수는 많은 하위 프로세스를 생성하며 이전 writeFile처럼 종료 순서를 보장할 수 없습니다.wait $!

for job in `jobs -p`

함수에서 생성된 하위 프로세스의 pid를 캡처할 수 있으며 현재 기본적으로 형식으로 반환되지만 일부 프로세스가 해당 줄에 도달하기 전에 완료되어 오류가 발생 하기 때문에 pid1 pid2 pid3 ...실행이 wait $pids작동하지 않습니다 .wait

참고: 저는 busybox Linux가 설치된 임베디드 시스템에서 실행 중이므로 상당히 단순화되었으며 많은 표준 기능을 사용할 수 없습니다.

답변1

wait명령에는 여러 인수가 제공될 수 있으며 이러한 모든 프로세스가 종료될 때까지 기다립니다. 따라서 기다리고 싶은 모든 PID를 루프의 배열에 넣고 다음을 사용하십시오.

wait ${pids[@]}

사이클 후.

관련 정보