병렬 작업을 제한하는 방법

병렬 작업을 제한하는 방법

/tmp/hostlist로그인하려면 사용자 이름과 비밀번호가 필요한 파일이 있는 호스트가 있습니다 . Expect 명령을 사용하여 호스트에 로그인하고 bash 스크립트에서 아래 표시된 대로 명령을 실행합니다.

)

VAR=$(expect -c "$script")

echo "$VAR" >/tmp/outexp
-----------------

병렬 실행을 처리할 수 있습니다.

while IFS= read -r i
do
        ( export server_name=`echo $i`;echo "connecting to $i";expect -c 
wait

제한할 수 있는 방법이 있나요? 한 번에 몇 명의 호스트가 있습니까? 예를 들어, 파일에 1000개의 호스트가 있고 1000개의 호스트를 완료하기 위해 한 번에 100개의 호스트 집합에서 실행하고 싶다고 가정해 보겠습니다.

답변1

GNU Parallel을 사용하면 다음과 같은 작업을 수행할 수 있습니다.

[compute $script]
export script
run_one() {
  i="$1"
  export server_name=`echo $i`
  echo "connecting to $i"
  expect -c "$script"
  echo "Job completed on $i"
  echo "-----------------------------------"
}
export -f run_one

cat "$file" | parallel -j100 run_one '2>&1' >"$log2"

또는:

[compute $script]
export script

cat "$file" |
  parallel -j100 --tag 'i={} expect -c "$script" 2>&1' >"$log2"

답변2

실행 중인 작업 수를 확인하고 완료될 때까지 기다릴 수 있습니다.

다음은 예제 스크립트입니다:

#!/bin/bash

i=0
while [[ $i -lt 50 ]]; do

    n=$(jobs | grep Running | wc -l)
    if [[ $n -ge 10 ]]; then
        echo "waiting for jobs to finish ($n running)"
        sleep 1
    else
        echo start next $i
        bash -c "sleep $(( $RANDOM % 3 )); echo $i finished" &
        let i+=1
    fi
done
wait

다음과 같이 병렬 호스트를 100개로 제한하는 데 사용할 수 있습니다.

while IFS= read -r i
do
    n=$(jobs | grep Running | wc -l)
    if [[ $n -ge 100 ]]; then
        echo "waiting for jobs to finish ($n running)"
        sleep 1
    else
        ( export server_name=`echo $i`;echo "connecting to $i";expect -c "$script";echo "Job completed on $i";echo "-----------------------------------" ) >> "${log}_${i}" 2>&1 &
    fi
done < "$file"

답변3

나는 일반적으로 생성된 하위 프로세스 수를 추적하고 대기열이 채워지는 최대값 미만인 한 사용자에게 의존하지 않는 약간 다른 접근 방식을 사용합니다.

max_jobs=100 # set queue size
while IFS= read -r i; do
  num_jobs=$(pgrep -c -P$$)
  if [[ $num_jobs -ge $max_jobs ]]; then
    wait -n $(pgrep -P$$) # Wait until a any subprocess terminates
  else
    <calling_awesome_script_here> &
  fi
done < "$file"

관련 정보