我正在尝试创建一个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脚本中这样做过。
这可能是一个愚蠢的问题,但我的选择是什么?
答案 0 :(得分:2)
您可以使用GNU parallel
答案 1 :(得分:1)
循环应如下所示:
while read -r ip ; do
scp test.iso "root@$ip:/tmp" &
done < IPs.conf
wait
答案 2 :(得分:0)
通过这个技巧,您可以控制同时运行的同时进程数:
cat IPs.conf | xargs -n1 -I{} -P10 scp test.iso "root@{}:/tmp"
检查-p10
这意味着同时使用10个进程。