我在一个有序列表中有成千上万个Shell作业队列,并且我需要从上到下并行运行4个作业,以避免使CPU饱和。如果仅将作业列表分成4个批处理脚本,则运行时将无法对齐,其中一个脚本将比其他脚本更早完成,而其他脚本仍有许多工作要做。我正在寻找一种方法,将所有4个批处理作业从队列顶部拉出下一个可用的作业。
我在工作中尝试过重击,但这不是我想要的
答案 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