다음 코드를 고려해보세요:
job()
{
local id=$1
sleep $id
}
do_job_in_parallel()
{
local pids=()
# run subshells
for id in $(seq 4)
do
job $id &
pids=("${pids[@]}" $!)
done
# wait subshells
for ((i=0; i<${#pids[@]}; ++i))
do
local pid=${pids[$i]}
wait $pid
exit_status=$?
if [[ $exit_status -ne 0 ]]
then
echo "job with pid $pid failed with exit status $exit_status"
#TODO: kill all subshells
fi
done
}
"하위 쉘 하나라도 실패하면 모든 서브 쉘이 실패합니다"라는 논리를 구현해야 한다고 생각하세요. X와 Y에 대한 대기가 순차적으로 수행되는 경우(위 코드 참조), 예를 들어 X를 기다리는 동안 Y가 실패하면 대기할 필요가 없습니다. 보다 정확하게는 "하위 쉘이 실패하면 다른 모든 서브 쉘을 즉시 종료"하는 방법을 구현하는 방법은 무엇입니까?
답변1
for 루프에 대한 쉬운 해결책은 없다고 생각 wait
하지만 GNU Parallel(https://www.gnu.org/software/parallel/) 이를 위해. 즐겨 사용하는 패키지 관리자에서 배포할 수 있어야 합니다.
#!/bin/bash
#
do_job()
{
local id=$1
sleep $id
}
export -f do_job
do_job_in_parallel()
{
parallel --halt now,done=1 do_job "{}" ::: $(seq 4)
}
do_job_in_parallel
"now,done=1" 외에도 다른 옵션이 있습니다. 새 작업 시작을 중지하는 soon
대신 진행 중인 프로세스가 정상적으로 종료되도록 하고, 프로세스가 0으로 종료되는 경우에만 중지하고, 그렇지 않은 경우에만 중지하도록 지정할 수 있습니다. 작업의 수 또는 백분율 등 모든 세부 사항은 문서에 있습니다:now
success=1
fail=1
https://www.gnu.org/software/parallel/parallel.html.