繁体   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