bash의 백그라운드 작업은 언제/언제 종료 상태를 반환합니까?

bash의 백그라운드 작업은 언제/언제 종료 상태를 반환합니까?

저는 많은 부분으로 구성된 bash 스크립트를 작성하고 있지만 복원력과 병렬 처리 기능이 최대한 많이 내장되어 있기를 바랍니다. 예는 다음과 같습니다:

while true
do
  var=$(curl someurl) || continue
  var2=$(curl someurl2) || continue
  var3=$(curl someurl3) || continue
  dosomething var1 || continue
  dosomething2 var2 || continue
  dosomething3 var3 || continue
  break
done

3개의 컬 명령을 병렬로 실행하고 3개의 "뭔가 작업 수행" 명령도 병렬로 실행하고 싶습니다. 하지만 이것이 어떻게 처리될지는 잘 모르겠습니다. 각 블록 뒤와 각 명령 뒤에 다음과 같이 wait명령을 삽입하는 것을 고려했습니다 .&

while true
do
  var=$(curl someurl) & || continue
  var2=$(curl someurl2) & || continue
  var3=$(curl someurl3) & || continue
  wait
  dosomething var1 & || continue
  dosomething2 var2 & || continue
  dosomething3 var3 & || continue
  wait
  break
done

그러나 이 경우 종료 상태 및/또는 경쟁 조건을 관리하는 방법을 잘 모르겠습니다. 또한 이것은 최고의 코딩 방법이 아닌 것 같습니다. 이를 수행할 수 있는 좋은 방법이 있습니까?

답변1

Bash를 사용하면 백그라운드에서 무언가의 출력을 캡처할 수 없습니다.

$ unset var; var=$(sh -c 'sleep 5; echo foo; exit 42') 
$ echo $? $var 
42 foo
$ unset var; var=$(sh -c 'sleep 5; echo foo; exit 42') & wait
[1] 30250
[1]+  Exit 42                 var=$(sh -c 'sleep 5; echo foo; exit 42')
$ echo $? $var 
0 

wait -n반품 이 있을 때일부백그라운드 프로세스가 종료되어 프로세스의 종료 상태로 종료되었습니다. 백그라운드 프로세스 수를 알고 있으므로 wait -n여러 번 수행할 수 있습니다. 못생겼지만...

while true
do
  curl someurl1 > file1 &
  curl someurl2 > file2 &
  curl someurl3 > file3 &
  for i in 1 2 3; do
    wait -n || { echo some curl failed; continue 2; }
  done

  dosomething "$(< file1)" &
  dosomething "$(< file2)" &
  dosomething "$(< file3)" &
  for i in 1 2 3; do
    wait -n || { echo some dosomething failed; continue 2; }
  done

  break
done

관련 정보