이 중첩된 for 루프를 어떻게 병렬로 실행할 수 있나요?

이 중첩된 for 루프를 어떻게 병렬로 실행할 수 있나요?
#!/usr/bin/bash

TARGETS=(
"81.176.235.2"
"81.176.70.2" 
"78.41.109.7" 
)

myIPs=(
"185.164.100.1"
"185.164.100.2"
"185.164.100.3"
"185.164.100.4"
"185.164.100.5"
)

for t in "${TARGETS[@]}"
  do 
    for a in "${myIPs[@]}"
    do 
      echo "${a} ${t} -p 80" >>log 2>&1 &
      echo "${a} ${t} -p 443" >>log 2>&1 &
      wait
    done 
    
done

TARGETS이 코드가 각 IP에 대해 echo 명령으로 시작하여 병렬로 실행되기를 원합니다 . 또한 스크립트는 동시에 여러 주소에 명령을 에코하도록 의도되지 않았 myIPs으므로 wait이를 내부 루프에 도입했습니다. .NET의 각 대상에 대해 쌍 echo(포트당 하나, 각각 하나 )을 병렬로 실행하고 싶습니다 80. 즉, 저는 이 작업을 수행하고 싶습니다(하지만 불행하게도 작동하지 않습니다).443TARGETS

for t in "${TARGETS[@]}"
do &
  for a in "${myIPs[@]}"
  do 
    echo "${a} ${t} -p 80" >>log 2>&1 &
    echo "${a} ${t} -p 443" >>log 2>&1 &
    wait
  done 

done
wait 

그러나 로드 평균이 너무 많이 증가하므로 다음을 원하지 않습니다.

for t in "${TARGETS[@]}"
do
  for a in "${myIPs[@]}"
  do 
    echo "${a} ${t} -p 80" >>log 2>&1 &
    echo "${a} ${t} -p 443" >>log 2>&1 &
  done 
done
wait 

내 목표를 어떻게 달성할 수 있나요?

PS 이것은 더 복잡한 스크립트의 일부일 뿐입니다. 관련 문제를 격리하고 싶었기 때문에 echo대신 네트워크 명령 중 하나를 사용했습니다.

답변1

귀하의 질문을 이해하기 어렵다고 생각합니다. 병렬 실행과 순차 실행을 원하는 것 같습니다.

넌 이걸 원해?

for t in "${TARGETS[@]}"; do 
  (
    for a in "${myIPs[@]}"; do 
      echo "${a} ${t} -p 80" >>log 2>&1 &
      echo "${a} ${t} -p 443" >>log 2>&1 &
      wait
    done 
  ) & 
done

각 대상의 for 루프는 백그라운드의 하위 쉘에서 실행됩니다.

답변2

내가 올바르게 이해했다면 두 루프를 반대로 하고 dones 사이에 대기 시간을 두어야 합니다. 좋다

for a in "${myIPs[@]}"
  do    for t in "${TARGETS[@]}"
          do    echo "${a} ${t} -p 80"  2>&1 &
                echo "${a} ${t} -p 443" 2>&1 &
          done 
        wait
  done

의 각 IP에 대해 myIPs두 개의 포트가 포함된 패킷을 세 개의 포트 각각에 보낸 TARGETS다음 여섯 개의 포트가 완료될 때까지 기다립니다.

관련 정보