Использование параллели в скрипте bash для обработки сгруппированных входных файлов - PullRequest
0 голосов
/ 30 октября 2018

У меня есть скрипт bash, который обрабатывает каждый файл в некотором каталоге:

for (( index=0; index<$COUNT; index++ ))
do
    srcFile=${INCOMING_FILES[$index]}
    ${SCRIPT_PATH}/control.pl ${srcFile} >> ${SCRIPT_PATH}/${LOG_FILE} &
    wait ${!}
    removeIncomingFile ${srcFile}
done

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

Файлы примеров:

server_1_1 | сервер_2_1 | server_3_1
сервер_1_2 | сервер_2_2 | server_3_2
сервер_1_3 | сервер_2_3 | сервер_3_3

скрипт должен обрабатывать файлы, связанные с каждым сервером параллельно.
Первый экземпляр - сервер_1 *
Второй экземпляр - сервер_2 *
Третий экземпляр - сервер_3 *

Возможно ли использовать GNU Parallel и как этого достичь? Большое спасибо за каждое решение!

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Группирующая часть меня смущает.

У меня такое чувство, что вы хотите, чтобы они были сгруппированы, потому что вы не хотите перегружать сервер.

Обычно вы просто делаете:

parallel "control.pl {}; removeIncomingFile {}" ::: incoming/files* > my.log

Это запустит одно задание на каждый поток ЦП.

Подумайте о том, чтобы потратить 20 минут на чтение главы 1 + 2 «GNU Parallel 2018» ( напечатано , онлайн ). Я думаю, что это поможет вам понять основные способы использования GNU Parallel.

0 голосов
/ 31 октября 2018

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

#!/bin/bash

# Do stuff for server 1
parallel -k 'echo server_1_{} ; date >> log_1_{}' ::: {1..3}

# Do stuff for server 2
parallel -k 'echo server_2_{} ; date >> log_2_{}' ::: {1..3}

# Do stuff for server 3
parallel -k 'echo server_3_{} ; date >> log_3_{}' ::: {1..3}

Пример вывода

server_1_1
server_1_2
server_1_3
server_2_1
server_2_2
server_2_3
server_3_1
server_3_2
server_3_3

Файлы журнала созданы

-rw-r--r--  1 mark  staff     29 30 Oct 21:04 log_1_1
-rw-r--r--  1 mark  staff     29 30 Oct 21:04 log_1_2
-rw-r--r--  1 mark  staff     29 30 Oct 21:04 log_1_3
-rw-r--r--  1 mark  staff     29 30 Oct 21:04 log_2_1
-rw-r--r--  1 mark  staff     29 30 Oct 21:04 log_2_2
-rw-r--r--  1 mark  staff     29 30 Oct 21:04 log_2_3
-rw-r--r--  1 mark  staff     29 30 Oct 21:04 log_3_1
-rw-r--r--  1 mark  staff     29 30 Oct 21:04 log_3_2
-rw-r--r--  1 mark  staff     29 30 Oct 21:04 log_3_3
...