Как параллельно обработать функцию с помощью циклов - PullRequest
0 голосов
/ 31 мая 2018

Итак, у меня есть эта функция, я хочу, чтобы эта функция одновременно запускала все, что в ней содержится.Пока это не работает, и, согласно другим источникам, именно так вы и делаете.Сама функция работает, если она не параллельна.

#!/bin/bash
foo () {
    cd ${HOME}/sh/path/to/script/execute
    for f in *.sh; do  #goes to "execute" directory and executes all 
    #scripts the current directory "execute" basically run-parts without cron

        cd ~/sh/path/to/script
        while IFS= read -r l1 #Line 1 in master.txt
              IFS= read -r l2 #Line 2 in master.txt
              IFS= read -r l3 #Line 3 in master.txt
        do
        cd /dev/shm/arb
        echo ${l1} > arg.txt & echo ${l2} > arg2.txt & echo ${l3} > arg3.txt 
        cd ${HOME}/sh/path/to/script/execute 
        bash -H ${f} #executes all scripts inside "execute" folder
        cd ~/sh/path/to/script/here
        ./here.sh &
        cd ~/sh/path/to/script &
        done <master.txt
    done

}

export -f foo
parallel ::: foo

Результат

#No result at all....., just buffers. htop doesn't acknowledge any 
#processes, and when this runs its pretty taxing on the cores.

master.txt content

В случае, если это имеет отношение:

apple_fruit
apple_veggie
veggie_fruit
#apple changes
pear_fruit
pear_veggie
veggie_fruit
#pear changes
cucumber_fruit
...

Я очень новичок в использовании параллельного интерфейса, и не знаю, как он работает в сложных (и базовых) ситуациях, не мешают ли циклы?И если это мешает, есть ли обходной путь?

1 Ответ

0 голосов
/ 31 мая 2018

Результат, вероятно, будет примерно таким:

inner() {
  script="$1"
  parallel -N3 "'$script' {}; here.sh  {}"  :::: master.txt
}
export -f inner
parallel inner ::: ${HOME}/sh/path/to/script/execute/*.sh

Это вызовет каждый из сценариев в ${HOME}/sh/path/to/script/execute/here.sh) с 3 аргументами из master.txt следующим образом:

${HOME}/sh/path/to/script/execute/script1.sh apple_fruit apple_veggie veggie_fruit

Вам необходимо изменить сценарии так, чтобы:

  • Они получали аргументы из командной строки (не из arg.txt, arg2.txt, arg3.txt).
  • Они отправляют свой вывод на стандартный вывод
...