1

Так что в Linux я хочу запустить скрипт 4 раза, а затем сделать что-то для вывода.

Я могу сделать:

script 1 > output1.txt
script 2 > output2.txt
script 3 > output3.txt
script 4 > output4.txt
cat output1.txt output2.txt output3.txt output4.txt > output5.txt
sort output5.txt | uniq -u 

Но я бы хотел, чтобы первые четыре работали параллельно (быстрее). Если я поставлю их на задний план, то он перейдет на пятую строчку, которая не будет успешной, пока первые четыре не закончат.

РЕДАКТИРОВАТЬ: Спасибо за ответы. Я попробовал несколько из них, но я не уверен, что они будут работать, потому что мне нужно (а) 4 разных скрипта для параллельного запуска, а не один и тот же четыре раза, и (б) выходы каждого скрипта быть сохранены в файл .txt (это очень важно). Я обновил выше, чтобы отразить это.

Люди в моем офисе любят использовать xargs, так что это было бы моим предпочтением (хотя я открыт для всего).

Спасибо!

3 ответа3

3

Встроенный механизм ожидания Bash сделает свое дело ...

script 1 > output1.txt &
script 2 > output2.txt &
script 3 > output3.txt &
script 4 > output4.txt &
wait
cat output1.txt output2.txt output3.txt output4.txt > output5.txt
sort output5.txt | uniq -u 
2

С parallel moreutils:

parallel -- script-1 script-2
cat out1 out2 out3 out4

Вторая строка будет запущена после завершения всех заданий из parallel интерфейса. Если ваш сценарий содержит аргументы, вам нужно заключить его в кавычки, например

parallel -- 'script-1 argument1' script-2

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

cat list-of-scripts > parallel -j4
cat out1 out2 out3 out4

-j4 означает, что parallel будет выполняться на 4 ядрах, если это возможно.

0

Я рекомендую использовать GNU parallel . Существует удобный учебник для него здесь . Это может либо позволить вам запустить все четыре сценария параллельно, а затем запустить пятую команду, либо вы можете настроить ее так, чтобы передавать из первых четырех в четвертый, выполняя все пять параллельно. Вот команда для запуска всех четырех параллельно:

parallel ::: script-1 script-2 script-3 script-4

Вы можете направить вывод непосредственно в пятую команду. По умолчанию, parallel будет группировать выходные данные каждой команды, например, если script-2 завершится первым, поток вывода начнется со всей выходной информации script-2, а затем завершится следующей командой. Используйте --line-buffer если вам не нужны выходные строки из разных команд. Используйте --keep-order если вам нужно, чтобы выходные данные команд содержались в порядке, то есть выходные данные из script-1, затем script-2 и т.д.

Другой вариант - просто использовать xargs , который уже должен быть установлен в вашей системе. xargs есть опция -P которая позволяет вам указать количество одновременных процессов. Обратите внимание, что он не обрабатывает группировку вывода, поэтому вы не можете напрямую передать в пятую команду. Обычно вам также нужно установить -n .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .