
ログインにユーザー名とパスワードを必要とするファイルを含むホストがあり/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 台のホストがあり、一度に 100 台のホストのセットを実行して 1000 台のホストを完了したいとします。
答え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"