Bash
如何限制並行作業
我有一個包含文件的主機,
/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"