Bash

Version 4 (Andrey Golovin, 12.08.2014 10:32)

1 1 Andrey Golovin
h1. Использование GNU parallel
2 1 Andrey Golovin
3 1 Andrey Golovin
Итак, есть задача по запуску счёта для некоторого количества задач.
4 1 Andrey Golovin
Чаще всего используется скрипт с циклом:
5 1 Andrey Golovin
<pre>
6 1 Andrey Golovin
for i in $(seq 0 6);do
7 1 Andrey Golovin
#    mkdir model_${i}
8 1 Andrey Golovin
##    remove OXT and H1-H2, rename H3 to H in original autodock pdb
9 1 Andrey Golovin
    echo "save model_${i}/pep.pdb, all, $i"
10 1 Andrey Golovin
    cat flex_short.pdb   model_${i}/pep.pdb > model_${i}/compl.pdb
11 1 Andrey Golovin
 cd model_${i}     
12 1 Andrey Golovin
     FlexPepDocking.linuxgccrelease -s compl.pdb  -flexpep_prepack  -ex1 -ex2aro \
13 1 Andrey Golovin
     -peptide_chain A -receptor_chain H >& log.prepack 
14 1 Andrey Golovin
     FlexPepDocking.linuxgccrelease -s compl_0001.pdb -receptor_chain H  -peptide_chain A \
15 1 Andrey Golovin
     -out:file:silent decoys.silent -out:file:silent_struct_type binary \
16 1 Andrey Golovin
     -pep_refine -ex1 -ex2aro -use_input_sc  -nstruct 300  >& log.run &
17 1 Andrey Golovin
 cd ..    
18 1 Andrey Golovin
done
19 1 Andrey Golovin
</pre>
20 1 Andrey Golovin
21 1 Andrey Golovin
Часто, в ходе работы надо коментировать некторые строки, так как эти задачи уже выполнены. Так же не плохо бы было реализовать эффективное использование всех вычмслительных ядер компьютера.
22 1 Andrey Golovin
23 1 Andrey Golovin
Давайте я предложу несколько примеров как эти шаги можно эффективно реализовать с GNU parallel:
24 1 Andrey Golovin
25 1 Andrey Golovin
26 1 Andrey Golovin
h5. Сделать N директорий:
27 2 Andrey Golovin
28 1 Andrey Golovin
<pre>
29 1 Andrey Golovin
parallel --gnu mkdir model_{1} ::: {1..6}
30 1 Andrey Golovin
or
31 1 Andrey Golovin
export n=6 
32 1 Andrey Golovin
parallel --gnu mkdir model_{1} ::: $(seq 1 $n)
33 2 Andrey Golovin
</pre>
34 2 Andrey Golovin
35 2 Andrey Golovin
h5. Генерация скрипта для Pymol
36 2 Andrey Golovin
37 2 Andrey Golovin
<pre>
38 2 Andrey Golovin
parallel --gnu  echo "save model_{1}/pep.pdb, all, {1}"  ::: $(seq 1 $n) > run.pml
39 2 Andrey Golovin
</pre>
40 2 Andrey Golovin
41 2 Andrey Golovin
h5. Склеить файлы:
42 2 Andrey Golovin
43 2 Andrey Golovin
<pre>
44 2 Andrey Golovin
parallel --gnu cat flex_short.pdb model_${1}/pep.pdb > model_${1}/compl.pdb ::: $(seq 1 $n)
45 2 Andrey Golovin
</pre>
46 2 Andrey Golovin
47 2 Andrey Golovin
h5. Запуск задач по prepacking на восьми ядрах:
48 2 Andrey Golovin
49 2 Andrey Golovin
<pre>
50 2 Andrey Golovin
parallel --gnu -j8 "cd model_{1} ; FlexPepDocking.linuxgccrelease @../flags.prepack -overwrite >& log.prepack" ::: $(seq 1 $n)
51 2 Andrey Golovin
</pre>
52 2 Andrey Golovin
53 2 Andrey Golovin
h5. Можно подавать функции bash на исполнение:
54 2 Andrey Golovin
55 2 Andrey Golovin
<pre>
56 4 Andrey Golovin
57 2 Andrey Golovin
export SHELL=$(type -p bash)
58 2 Andrey Golovin
59 2 Andrey Golovin
prepack() {  
60 2 Andrey Golovin
      cd model_${1}
61 2 Andrey Golovin
      FlexPepDocking.linuxgccrelease @../flags.prepack -overwrite >& log.prepack 
62 2 Andrey Golovin
}
63 2 Andrey Golovin
64 2 Andrey Golovin
n=9
65 2 Andrey Golovin
66 3 Andrey Golovin
export -f prepack 
67 1 Andrey Golovin
68 4 Andrey Golovin
parallel -j6   prepack ::: $(seq 1 $n)
69 4 Andrey Golovin
</pre>
70 4 Andrey Golovin
71 4 Andrey Golovin
Итак весь скрипт можно представить как набор однострочных команд исполняюшихся паралельно:
72 4 Andrey Golovin
73 4 Andrey Golovin
<pre>
74 4 Andrey Golovin
#!/bin/bash
75 4 Andrey Golovin
export SHELL=$(type -p bash)
76 4 Andrey Golovin
77 4 Andrey Golovin
prepack() {  
78 4 Andrey Golovin
cd model_${1}
79 4 Andrey Golovin
      FlexPepDocking.linuxgccrelease @../flags.prepack -overwrite >& log.prepack 
80 4 Andrey Golovin
}
81 4 Andrey Golovin
refine() {  
82 4 Andrey Golovin
cd model_${1}
83 4 Andrey Golovin
      FlexPepDocking.linuxgccrelease @../flags.refine -overwrite >& log.refine 
84 4 Andrey Golovin
}
85 4 Andrey Golovin
86 4 Andrey Golovin
export -f prepack refine
87 4 Andrey Golovin
88 4 Andrey Golovin
n=9
89 4 Andrey Golovin
90 4 Andrey Golovin
parallel --gnu mkdir model_{1} ::: $(seq 1 $n)
91 4 Andrey Golovin
92 4 Andrey Golovin
parallel --gnu  echo "save model_{1}/pep.pdb, all, {1}"  ::: $(seq 1 $n) > run.pml
93 4 Andrey Golovin
94 4 Andrey Golovin
parallel --gnu  cat flex_short.pdb model_{1}/pep.pdb > model_{1}/compl.pdb ::: $(seq 1 $n)
95 4 Andrey Golovin
96 4 Andrey Golovin
parallel -j6   prepack ::: $(seq 1 $n)
97 4 Andrey Golovin
98 4 Andrey Golovin
parallel -j6 refine ::: $(seq 1 $n)
99 4 Andrey Golovin
100 1 Andrey Golovin
</pre>