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

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

Я пытался научиться использовать 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 логических потока в одной команде, используя parallel.

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

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


person Sj L    schedule 29.04.2019    source источник
comment
влияет ли ваш скрипт на какие-либо общие ресурсы, которые могут как-то усложнить распараллеливание?   -  person Reda Meskali    schedule 29.04.2019
comment
Если вы хотите запустить процесс в фоновом режиме в bash, добавьте & к команде. См. также en.wikipedia.org/wiki/Job_control_(Unix).   -  person Jesper Juhl    schedule 29.04.2019
comment
Jesper, да, я могу использовать bash и &, но я хочу написать один скрипт для распараллеливания с помощью gno_parallel   -  person Sj L    schedule 29.04.2019
comment
Реда, насколько я знаю, я аккуратно распределил и особо не буду   -  person Sj L    schedule 29.04.2019


Ответы (1)


Что-то типа:

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' 
person Mark Setchell    schedule 29.04.2019
comment
Спасибо, Марк. Вы правы, это мультиобработка, извините за неправильную классификацию, я это изменю. Это почти все. У меня есть еще один вопрос к вам: во-первых, скажем, если бы я хотел сделать 1..4, затем 6, 11..20, какой был бы правильный синтаксис? Пробовал запускать с 1,2,3,4,6,... Еще есть возможность распечатать распечатки и логи? - person Sj L; 29.04.2019
comment
Я добавил пример синтаксиса для несмежных номеров каталогов. Не могли бы вы уточнить или задать вопрос о журналах и распечатках, пожалуйста? Какие журналы и распечатки? Где они? - person Mark Setchell; 29.04.2019
comment
Что касается лога, пожалуйста, не обращайте внимания. Каким-то образом он сохранился в кеше, при тестировании я нашел способ просто использовать команду ›log.log - person Sj L; 29.04.2019
comment
Однако я думаю, что это может противоречить политике одной темы на вопрос, но у меня есть еще один вопрос. Предположим, у меня есть огромный список файлов, на которых мне нужно выполнить blah.exe. Скажем, у меня есть список имен файлов в glah.tmp, который я знаю для использования во время команды ‹‹glah.tmp. Есть ли gnu_parallel, эквивалентный этому? - person Sj L; 29.04.2019
comment
Вопросы бесплатно - и ответы! Я думаю, что было бы лучше спросить еще один, поскольку потенциально есть несколько решений, и это может запутаться. Вы всегда можете нажать share под исходным вопросом, скопировать гиперссылку и вставить ее в новый вопрос для справки. Я буду следить за новым вопросом, и я уверен, что Оле Танге (автор parallel) тоже его увидит, так что вы должны получить ответ довольно скоро. - person Mark Setchell; 29.04.2019