【问题标题】:Running parallel commands in bash在 bash 中运行并行命令
【发布时间】:2018-02-12 22:56:31
【问题描述】:

我有一个包含多个批处理文件的目录“批处理”:

one.txt
two.txt
...
seventy.txt

这些文件中的每一个都需要由 python 脚本处理为:

python processor.py --inputFile=batches/one.txt

我目前的实现是这样的:

for f in batches/$f
do
python processor.py --inputFile=batches/$f
done

我有数百个批次,因此将所有批次并行运行

python processor.py --inputFile=batches/$f &

不可行。

但是,我认为一次运行 ~10 个应该不是问题。

我知道语法

{
python processor.py --inputFile=batches/batchOne.txt
python processor.py --inputFile=batches/batchTwo.txt
} &
{
python processor.py --inputFile=batches/batchThree.txt
python processor.py --inputFile=batches/batchFour.txt
}

应该给我一个类似于我想要的结果。但是,有没有更好的解决方案?基本上,在我的情况下,给定一个命令模板

python processor.py --inputFile=batches/$1

还有一个批次列表,我想控制同时执行多少个。

我正在开发 Ubuntu Linux。

【问题讨论】:

  • +1 用于提出一个实际上与编程和开发有关的 bash 问题(并没有因为 bash 而被标记)。

标签: python linux bash


【解决方案1】:

尝试这样做以运行 10 次 // 执行:

parallel -j 10 command_line    

安装它

sudo apt-get install parallel

【讨论】:

  • 这是否允许我为每次执行指定自定义参数?
  • 你必须以编程方式进行
【解决方案2】:

parallel 是一个很棒的工具,但您并不总是可以选择在系统上安装其他软件包。您可以使用 bash jobs 模拟 parallel

这是一个小例子:

#!/usr/bin/env bash

for FILE in /tmp/*.sh;
do
    # count only running jobs. 
    JOBS=$(jobs -r | wc -l)
    while [[ ${JOBS} -ge 3 ]];
    do
        echo "RUNNING JOBS = ${JOBS} => WAIT"
        sleep 5 # too much, just for demo
    done
    echo "APPEND ${FILE} TO JOBS QUEUE [JOBS: ${JOBS}]"
    bash ${FILE} &
done

exit 0

测试:

$ grep '' /tmp/file*.sh
/tmp/file01.sh:sleep 8
/tmp/file02.sh:sleep 10
/tmp/file03.sh:sleep 5
/tmp/file04.sh:sleep 10
/tmp/file05.sh:sleep 8
/tmp/file06.sh:sleep 8

$ ./parallel.sh
APPEND /tmp/file01.sh TO JOBS QUEUE [JOBS: 0]
APPEND /tmp/file02.sh TO JOBS QUEUE [JOBS: 1]
APPEND /tmp/file03.sh TO JOBS QUEUE [JOBS: 2]
RUNNING JOBS = 3 => WAIT
APPEND /tmp/file04.sh TO JOBS QUEUE [JOBS: 2]
RUNNING JOBS = 3 => WAIT
APPEND /tmp/file05.sh TO JOBS QUEUE [JOBS: 1]
APPEND /tmp/file06.sh TO JOBS QUEUE [JOBS: 2]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多