在bash脚本中使用parallel以便处理分组的输入文件

时间:2018-10-30 20:25:23

标签: linux bash parallel-processing gnu

我有一个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 | server_2_1 | server_3_1
server_1_2 | server_2_2 | server_3_2
server_1_3 | server_2_3 | server_3_3

脚本应处理与每个服务器并行相关的文件。
第一个实例-server_1 *
第二实例-server_2 *
第三实例-server_3 *

是否可以使用GNU Parallel以及如何实现? 非常感谢您的每种解决方案!

2 个答案:

答案 0 :(得分:1)

对于您要说的问题,我无能为力,但我怀疑以下内容将成为一个合理的起点。您将实际代码放在'...'中,而不是我使用的虚拟操作中:

#!/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

答案 1 :(得分:1)

分组部分使我感到困惑。

我觉得您希望将它们分组,因为您不想使服务器超载。

通常,您只需执行以下操作即可:

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

这将在每个CPU线程上运行一项作业。

考虑花20分钟阅读“ GNU Parallel 2018”(printedonline)的第1 + 2章。我认为这将帮助您了解GNU Parallel的基本用法。