如何并行启动多个命令行



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

我想在后台并行启动所有这些。
我怎样才能做到这一点?

这是我的外壳文件的一些行:

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

如果你想获得一个专门为这类事情编写的工具的全部好处,你可以使用 GNU Parallel。您可能会将 shell 脚本(我们称之为 commands)更改为如下所示:

printf "29n29n" | gmx rms -s md.tpr -n index_analysis.ndx -f md.xtc -o rmsd_fc_chain_B.xvg -tu ns
printf "32n32n" | 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 个,或者如果您想一次运行 32 个,-j 32。您可以使用 --dry-run 来测试它会做什么,而无需实际执行任何操作:

parallel --dry-run < cmds
printf "29n29n" | gmx rms -s md.tpr -n index_analysis.ndx -f md.xtc -o rmsd_fc_chain_B.xvg -tu ns
printf "32n32n" | gmx rms -s md.tpr -n index_analysis.ndx -f md.xtc -o rmsd_fc_chain_C.xvg -tu ns

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

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

sleep 60 &
sleep 60 &
sleep 60 &

将在后台运行 3 次睡眠(并且它们是并行执行的)。例如,从脚本 http://www.cyberciti.biz/faq/linux-command-line-run-in-background/或在后台执行 shell 命令

对于与here_doc一起使用的组合:在后台使用HERE_DOC方法运行脚本。这应该有效(仅显示一个命令):

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

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

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 你可以这样做:

doit() {
  printf "$2n$2n" |
  gmx rms -s md.tpr -n index_analysis.ndx -f md.xtc -o rmsd_fc_chain_${1}.xvg -tu ns
}
export -f doit
parallel doit ::: {A..Z} ::: {1..100}

通过演练教程了解有关 GNU 并行的更多信息:https://www.gnu.org/software/parallel/parallel_tutorial.html

相关内容

  • 没有找到相关文章

最新更新