제가 작성 중인 스크립트의 백그라운드에서 일부 프로세스를 시작하고 있습니다. 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[@]}
사이클 후.