2016-06-01 3 views
2

В настоящее время я запускаю файл оболочки на Gromacs (Linux) с 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 

ответ

5

Если вы хотите, чтобы иметь полное преимущество инструмента явно написан для такого рода вещи, вы можете использовать GNU Parallel. Вы, вероятно, изменить свой скрипт (назовем его 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

запускать их в фоновом режиме, используя &, например,

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 
0

на основе команды, которую вы написали вы можете запустить что-то вроде (тест все 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 "$2\n$2\n" | 
    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 Parallel пешком через учебник: https://www.gnu.org/software/parallel/parallel_tutorial.html

Смежные вопросы