我如何排队多个作业,但是使用Bash将其限制为一次运行5个

时间:2017-11-03 18:46:48

标签: bash autosys

我有一个文本文件,其中包含要处理的作业列表。它可以一次处理所有这些,但它会使计算机资源超载并且一些作业失败。它也可以一次处理一行,但整个处理时间太长。

我的客户要求我们一次处理5个,看看我们是否可以加快处理时间而不会错过任务。我觉得这是可能的,而且很可能很容易,但是我的大脑被卡在上面,我无法弄明白。

每个作业都在文本文件的一行上。有没有办法加载要运行的作业列表,但是限制它一次运行5个?

2 个答案:

答案 0 :(得分:1)

这应该以您正在寻找的方式执行。我没有测试过它。它只适用于BASH。

IFS=$'\n' read -d '' -r -a jobs < list_of_jobs.txt
total_number_of_jobs=$( wc -l list_of_jobs.txt | awk '{print $1}' )
i=0;
accumulated=0;
limit=5; #How many to process at the same time
while [ $i -lt $total_number_of_jobs ]
do
    while [ $accumulated -lt $limit ] && [ $i -lt $total_number_oj_jobs ]
    do
        ./${jobs[$i]} &
        (( i ++ ))
        (( accumulated ++ ))
    done
    wait
    accumulated=0

done

请告诉我它是否对您有所帮助。此致!

答案 1 :(得分:1)

我建议 GNU Parallel 如下:

parallel -j 5 -a YourJobFile

有很多选项,请尝试添加—-eta—-progress