Bash

如何限制並行作業

  • October 1, 2021

我有一個包含文件的主機,/tmp/hostlist它需要使用者名和密碼才能登錄,我正在使用期望命令登錄主機並執行命令,並在我的 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 台主機。

使用 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"

您可以檢查有多少作業正在執行並等待它們完成。

這是一個範例腳本:

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

引用自:https://unix.stackexchange.com/questions/610931