
Eu tenho um arquivo contendo hosts /tmp/hostlist
que 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"