如何并行启动多个命令行

时间:2016-06-01 11:32:02

标签: linux bash shell

我目前正在Gromacs(Linux)上发布一个包含60个不同命令的shell文件。启动文件时,命令将逐个顺序处理。

我想在后台和后台并行发布所有这些内容 我怎样才能做到这一点?

这是我的shell文件的一些行:

gmx rms -s md.tpr -n index_analysis.ndx -f md.xtc -o rmsd_fc_chain_B.xvg -tu ns << eof
29
29
eof

gmx rms -s md.tpr -n index_analysis.ndx -f md.xtc -o rmsd_fc_chain_C.xvg -tu ns << 
eof
32
32
eof

gmx rms -s md.tpr -n index_analysis.ndx -f md.xtc -o rmsd_fc_chain_D.xvg -tu ns << 
eof
35
35
eof

3 个答案:

答案 0 :(得分:5)

如果您希望充分利用为此类事物明确编写的工具,可以使用 GNU Parallel 。你可能会改变你的shell脚本(让它称之为commands)看起来像这样:

printf "29\n29\n" | gmx rms -s md.tpr -n index_analysis.ndx -f md.xtc -o rmsd_fc_chain_B.xvg -tu ns
printf "32\n32\n" | gmx rms -s md.tpr -n index_analysis.ndx -f md.xtc -o rmsd_fc_chain_C.xvg -tu ns

然后你可以运行:

parallel -j 8 < commands

如果你想一次运行8个,或者-j 32如果你想一次运行32个。您可以使用--dry-run

来测试它的功能,而无需实际执行任何操作
parallel --dry-run < cmds
printf "29\n29\n" | gmx rms -s md.tpr -n index_analysis.ndx -f md.xtc -o rmsd_fc_chain_B.xvg -tu ns
printf "32\n32\n" | gmx rms -s md.tpr -n index_analysis.ndx -f md.xtc -o rmsd_fc_chain_C.xvg -tu ns

您还可以使用Estimated Time of Arrival获得--eta,并将作业分散到您可以ssh进入的网络上的任何其他计算机上。你明白了 - 非常灵活。

答案 1 :(得分:1)

使用&在后​​台运行它们,例如

sleep 60 &
sleep 60 &
sleep 60 &

将在后台运行3次睡眠(并且它们并行执行)。参见例如http://www.cyberciti.biz/faq/linux-command-line-run-in-background/executing shell command in background from script

对于与here_doc一起使用的组合:Running script with HERE_DOC method in background。这应该工作(只显示一个命令):

gmx rms -s md.tpr -n index_analysis.ndx -f md.xtc -o rmsd_fc_chain_B.xvg -tu ns << eof &
29
29
eof

答案 2 :(得分:0)

根据您编写的命令,您可能希望运行类似的东西(使用全部1..100测试所有A..Z):

Row

使用GNU Parallel,你会这样做:

gmx rms -s md.tpr -n index_analysis.ndx -f md.xtc -o rmsd_fc_chain_{A..Z}.xvg -tu ns << 
eof
{1..100}
eof

通过浏览教程了解有关GNU Parallel的更多信息:https://www.gnu.org/software/parallel/parallel_tutorial.html