저는 많은 부분으로 구성된 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