我正在使用AIX Korn Shell执行Perl脚本,该脚本接受1到50的数字参数,并同时在后台运行它们。有没有办法限制后台进程,例如5?如果一个完成,则执行下一个。我当前的代码只是在后台执行所有代码。
<div class="tra-ra-cont">
<div class="tra-ra-box" id="ra1"><a href="">Range 1</a></div>
<div class="tra-ra-box" id="ra2"><a href="">Range 2</a></div>
<div class="tra-ra-box" id="ra3"><a href="">Range 3</a></div>
<div class="tra-ra-box" id="ra4"><a href="">Range 4</a></div>
<div class="tra-ra-box" id="ra5"><a href="">Range 5</a></div>
<div class="tra-ra-box" id="ra6"><a href="">Range 6</a></div>
<div class="tra-ra-box" id="ra7"><a href="">Range 7</a></div>
<div class="tra-ra-box" id="ra8"><a href="">Range 8</a></div>
<div class="tra-ra-box" id="ra9"><a href="">Range 9</a></div>
<div class="tra-ra-box" id="ra10"><a href="">Range 10</a></div>
<div class="tra-ra-box" id="ra11"><a href="">Range 11</a></div>
<div class="tra-ra-box" id="ra12"><a href="">Range 12</a></div>
</div>
例如,如果2完成,则执行下一个6,依此类推。
答案 0 :(得分:5)
周围有各种各样的KSH版本。自版本4(ksh88
)开始,原始的Korn Shell /usr/bin/ksh
是IBM AIX中的默认Shell。但是它们还支持增强的Korn Shell,ksh93
(/usr/bin/ksh93
),它具有更多的花哨功能。在这种情况下,正是那些风吹草动的生活:
KSH93::在KSH93中,您有一个shell变量JOBMAX
为您完成此操作:
JOBMAX
::此变量定义一次可以运行的正在运行的后台作业的最大数量。达到此限制后,外壳程序将在开始新作业之前等待作业完成。
JOBMAX=5
i=1; while [[ $i -le 50 ]]; do perl some_script.pl $i &; ((i+=1)); done;
顺便说一句。您可能对使用for循环感兴趣。
JOBMAX=5
for i in $(seq 1 50); do perl some_script.pl "$i" &; done
KSH::如果您不能使用KSH93并且必须遵守POSIX 2兼容的KSH,则可以考虑使用xarg
,但前提是它允许--max-procs
标志。
seq 1 50 | xargs -I{} --max-procs=5 perl some_script.pl {}
可悲的是,AIX does not support the --max-procs
flag。
因此,您必须自己构建一些东西:
procmax=5
for i in $(seq 1 50); do
perl some_script.pl "$i" &;
(( i%procmax == 0 )) && wait
done
不幸的是,这并不是真正的并行版本,因为它将等到前5个进程完成后才开始下一批5。
因此,您可以看一下jobs
并执行以下操作:
procmax=5
checkinterval=1
for i in $(seq 1 50); do
perl some_script.pl "$i" &;
while [[ $(jobs -l | wc -l) -ge "$procmax" ]]; do
sleep "$checkinterval";
done
done
由于sleep
,这还不是很完美,但是必须这样做。