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