Como limitar trabalhos paralelos

Como limitar trabalhos paralelos

Eu tenho um arquivo contendo hosts /tmp/hostlistque requer nome de usuário e senha para fazer login e estou usando o comando expect para fazer login em hosts e executar o comando e sair como abaixo em meu script bash.

)

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

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

Sou capaz de lidar com a execução paralela -

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

Existe uma maneira de limitar não. de hosts por vez? por exemplo, suponha que eu tenha 1.000 hosts em um arquivo..e quero executar um conjunto de 100 hosts por vez para completar 1.000 hosts..

Responder1

Com o GNU Parallel você faria algo como:

[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"

Ou:

[compute $script]
export script

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

Responder2

Você pode verificar quantos trabalhos estão em execução e esperar até que sejam concluídos.

Aqui está um exemplo de script:

#!/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

Você usaria assim para limitá-lo a 100 hosts em paralelo:

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"

Responder3

Eu normalmente uso uma abordagem um pouco diferente que não depende de você acompanhar o número de subprocessos gerados e sempre que a fila for menor que o máximo, ela será preenchida

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"

informação relacionada