Как использовать gnu_parallel для запуска нескольких исполняемых и / или bash-скриптов? - PullRequest
2 голосов
/ 29 апреля 2019

Недавно я пытался запускать свои сценарии параллельно более удобным способом, чем открывать несколько экземпляров терминала и выполнять сценарии отдельно.

Я пытался научиться использоватьgnu_parallel в течение последних нескольких дней, и я все еще немного не в курсе, и надеюсь, что кто-то может привести прямой пример.

Предположим, у меня есть скомпилированный код g ++ с именем blah.exe и скрипт bash с именем blah.shэто будет работать отлично, но я хочу выполнить их в разных каталогах.

Я читал https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Working-as-xargs--n1.-Argument-appending

и

https://www.biostars.org/p/182136/

но мне не совсем понятен синтаксис

Чтобы запустить их последовательно, я бы сделал:

for i in 1 2 3 4
mv ./blah.exe directory$i
cd directory$i
./blah.exe all
cd ..
end

аналогично

for i in 1 2 3 4
mv ./blah.sh directory$i
cd directory$i
source ./blah.sh all
cd ..
end

Я пытаюсьчтобы понять, как я разделил бы эту нагрузку на 4 логических потока в одной команде, используя параллель.

Может ли кто-нибудь привести пример для этого?

Спасибо за ваше время.

1 Ответ

2 голосов
/ 29 апреля 2019

Что-то вроде:

parallel --dry-run 'cd directory{}; ../blah.exe all; source ../blah.sh all' ::: {1..4}

Нет необходимости копировать / перемещать исполняемый файл, просто запустите тот же.

После этого не нужно cd .., так как каждый новый процессвремя.

Обратите внимание, что это не многопоточность, это многопоточность.


Если вы хотите обработать непрерывные номера каталогов, вы можете использовать:

parallel ... ::: {1..4} 6 7 {11..14}

Если вы хотите обработать все каталоги, вы можете использовать:

printf "%s\0" */ | parallel -0 'cd {}; pwd' 

Если вы хотите обработать все каталоги, начиная с FRED, вы можете использовать:

printf "%s\0" FRED*/ | parallel -0 'cd {}; pwd' 
...