如何创建/管理作业队列

时间:2019-09-04 11:50:55

标签: bash

我在一个有序列表中有成千上万个Shell作业队列,并且我需要从上到下并行运行4个作业,以避免使CPU饱和。如果仅将作业列表分成4个批处理脚本,则运行时将无法对齐,其中一个脚本将比其他脚本更早完成,而其他脚本仍有许多工作要做。我正在寻找一种方法,将所有4个批处理作业从队列顶部拉出下一个可用的作业。

我在工作中尝试过重击,但这不是我想要的

1 个答案:

答案 0 :(得分:1)

我仍然喜欢自己制作这样的脚本:p在一个脚本下面,该脚本根据N的大小运行命令。进程退出后,该条目将用于存储另一个子pid。

run_from_file.sh

#! /bin/bash

N=4  # Amount of jobs to run in parallel
T=0  # Counter for amount of jobs
Q=() # Job queue
FILE='jobs.txt'

# Clean Q array
function _clean {
        for ((i=0; i < ${N}; ++i)); do
                tst=/proc/${Q[$i]}
                if [ ! -d $tst ]; then
                        Q[$i]=0
                fi
        done
}

# Setup the Q
for ((i=0; i < $N; i++)); do
        Q[$i]=0
done

while read -r line; do
        echo $line
        $line &

        # Try to find an open sport (Q[i]=0)
        while true; do
                for ((i=0; i < ${N}; ++i)); do
                        if [ ${Q[$i]} -eq 0 ]; then
                                Q[$i]=$!
                                break 2
                        fi
                done
                # Clean the Q array if no free entry is found
                _clean
        done
        ((T++))
done < ${FILE}
wait
echo "Processed ($T/$(wc -l < jobs.txt)) jobs"
exit 0

jobs.txt

sleep 1s
sleep 1s
sleep 1s
sleep 1s
sleep 10s
sleep 5s
sleep 2s
sleep 2s
sleep 4s
sleep 3s
sleep 3s
sleep 3s

OLD:
<罢工> 我喜欢自己创建这样的东西,因为它具有可伸缩性。例如,它允许您在调用wait之前执行某些操作,或者可以获取并存储子进程ID到文本文件中。

run_from_file.sh

#! /bin/bash

X=0 # Counter 
N=4 # Total amount of parallel processes
FILE='jobs.txt'
while read -r line; do 
        echo $line
        $line &

        # Raise counter
        ((X = ++X % N))
        if [ "$X" -eq 0 ]; then
                echo "Waiting"
                wait # Wait on processes to finish
        fi
done < ${FILE}

exit 0