在Korn Shell中排队命令

时间:2018-07-31 12:48:29

标签: shell ksh

我正在使用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,依此类推。

1 个答案:

答案 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,这还不是很完美,但是必须这样做。

相关问题