如何在GNU并行环境中将参数发送到bash脚本

问题描述

我想使用GNU parallel来并行执行一些命令,但是我不知道如何将参数发送到我的bash脚本。

我的bash_script.sh:

scp $1.zip xxx@1.com:~/
scp $1.zip xxx@2.com:~/
scp $1.zip xxx@3.com:~/
scp $1.zip xxx@4.com:~/
scp $1.zip xxx@5.com:~/

我可以将参数发送到bash_script并按顺序执行。

bash bash_script.sh argument

但是如何并行执行呢?

parallel -a bash_script argument

解决方法

parallel可以并行执行各个进程,但是脚本通常旨在作为单个进程运行。

你可以做

parallel scp "$1" xxx@{}1.xyz.com: ::: {1..5}

或者如果您真的想将脚本文件分成几行

sed "s#\$1#$1#g" bash_script.sh | parallel

如果脚本只是静态文本,则可以简单地parallel逐行阅读;但是parallel在这种情况下没有$1的值,因此我们将其替换,然后用管道将替换的行通过管道进行并行执行。

切切地注意proper variable quoting,不要在Bash脚本上添加.sh扩展名。 (基本上,不要在任何脚本上添加任何扩展名。)

,

也许是这样的:

for server in server1 server2 server 3
do
   scp "$1" $server: &
done

&使作业在后台运行。如果我不理解您的要求,请澄清。

,

对我有用的解决方案是将命令写入文本文件(例如,commands.txt)并执行 parallel

parallel -j 2 < commands.txt
,

bash_script.sh

parallel scp "$1" xxx@{}.com: ::: {1..5}

用法:

bash bash_script.sh argument