【问题标题】:Using parallel in bash script in order to processing grouped input files在 bash 脚本中使用并行来处理分组的输入文件
【发布时间】:2018-10-30 20:25:22
【问题描述】:

我有一个处理某个目录中每个文件的 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 |服务器_3_1
服务器_1_2 |服务器_2_2 | server_3_2
服务器_1_3 |服务器_2_3 | server_3_3

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

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

【问题讨论】:

  • 为什么只在后台运行一个命令然后等待?如果一次做几个更有意义......
  • this response 可能会对您有所帮助。在后台生成命令并等待它们是合乎逻辑的。甚至还有 POC 版本的假脱机脚本。该页面还有很多关于 parallel 的有用信息。
  • 代码中的任何内容都与您提到的服务器编号无关!管道符号 (|) 试图告诉我什么?

标签: linux bash parallel-processing gnu


【解决方案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

【讨论】:

    【解决方案2】:

    分组部分让我很困惑。

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

    通常你会这样做:

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

    这将为每个 CPU 线程运行一个作业。

    考虑花 20 分钟阅读“GNU Parallel 2018”的第 1+2 章(printedonline)。我想它会帮助你理解 GNU Parallel 的基本用法。

    【讨论】:

    • 感谢您的回答。我有很多应该监控的服务器。来自每台服务器的准备好的文件被提供给一台机器,其中脚本按日期顺序处理它们。该日期是文件名 fe 的一部分。 TYPE1_server01_20181030_194002.out。文件处理后,数据将插入数据库。基于此,我可以准备可用性报告等。我想按日期顺序为每个服务器并行处理这些文件。
    猜你喜欢
    • 1970-01-01
    • 2016-07-17
    • 2015-03-24
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2022-10-16
    相关资源
    最近更新 更多