簡體   English   中英

使用文件輸入運行並行命令的Bash腳本

[英]Bash script for running parallel commands using input from a file

我正在嘗試制作一個Shell腳本,該腳本讀取配置文件並並行執行每一行的命令。

例如,我有IPs.cfg,其中可以包含可變數量的IP。 可能是一個或幾個

IPs.cfg

145.x.x.x
176.x.x.x
192.x.x.x

我想讀取文件,然后同時對每行執行一個命令...例如:

scp test.iso root@$IP1:/tmp &
scp test.iso root@$IP2:/tmp &
scp test.iso root@$IP3:/tmp &
wait

我認為這是將IP存儲到陣列中的方式

IFS=$'\n' read -d '' -r -a array < IPs.cfg

然后我從文件中提取行數,並將其減少1,因為數組從0開始。

NUMLINES=`cat IPs.cfg | wc -l`
NUMLINES=$((NUMLINES-1))

現在,我想同時執行所有命令。 這是可變數量的參數,因此我不能僅手動使用scp test.iso root@${array[0]}:/tmp & scp test.iso root@${array[1]}:/tmp & so on 我可以使用while循環,但這意味着一次執行一個命令。 我也在考慮使用遞歸,但是我從未在bash腳本中做到這一點。

這可能是一個愚蠢的問題,但是我在這里有什么選擇?

您可以利用GNU並行

循環應如下所示:

while read -r ip ; do
   scp test.iso "root@$ip:/tmp" &
done < IPs.conf
wait

使用此技巧,您可以控制同時運行的並發進程數:

cat IPs.conf | xargs -n1 -I{} -P10 scp test.iso "root@{}:/tmp"

選中-p10表示同時使用10個進程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM