我目前正在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