kornshell中的队列命令

kornshell中的队列命令,shell,ksh,Shell,Ksh,我使用aixkornshell执行一个Perl脚本,该脚本接受从1到50的数值参数,并在后台同时运行它们。有没有办法限制后台进程,例如5?如果一个完成,执行下一个。我当前的代码只是在后台执行它们 i=1; while [[ $i -le 50 ]]; do perl some_script.pl $i &; ((i+=1)); done; 例如,如果2完成,则执行下一个,即6,依此类推。KSH有各种版本。原始的Korn Shell,ksh88是IBMAIX中自版本4(/usr/bin/

我使用aixkornshell执行一个Perl脚本,该脚本接受从1到50的数值参数,并在后台同时运行它们。有没有办法限制后台进程,例如5?如果一个完成,执行下一个。我当前的代码只是在后台执行它们

i=1; while [[ $i -le 50 ]]; do perl some_script.pl $i &; ((i+=1)); done;

例如,如果2完成,则执行下一个,即6,依此类推。

KSH有各种版本。原始的Korn Shell,
ksh88
是IBMAIX中自版本4(
/usr/bin/ksh
)以来的默认Shell。但它们也支持增强的Korn Shell,
ksh93
/usr/bin/ksh93
),它有更多的铃铛和哨子。在这种情况下,正是这些钟声和口哨让生活变得轻松:

KSH93:在KSH93中,您有一个shell变量
JOBMAX
,它为您执行以下操作:

JOBMAX
此变量定义一次可以运行的最大后台作业数。当达到此限制时,shell将在开始新作业之前等待作业完成

顺便说一句,您可能对使用for循环感兴趣

JOBMAX=5
for i in $(seq 1 50); do perl some_script.pl "$i" &; done

<强> KSH:如果不能使用KSH99并必须遵守POSIX 2兼容的KSH,则可以考虑使用<代码> XARG,但仅当它允许<代码> -max PROS FLAG。

seq 1 50 | xargs -I{} --max-procs=5 perl some_script.pl {}
可悲的是

所以,你必须自己建造一些东西:

procmax=5
for i in $(seq 1 50); do
   perl some_script.pl "$i" &;
   (( i%procmax == 0 )) && wait
done
不幸的是,这并不是一个真正的并行版本,因为它要等到前5个进程完成后才能开始下一批5个进程

因此,您可以查看一下
作业
,并对其进行处理:

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

由于
睡眠
,这仍然不是完全平行的,但必须这样做。

有各种版本的KSH。原始的Korn Shell,
ksh88
是IBMAIX中自版本4(
/usr/bin/ksh
)以来的默认Shell。但它们也支持增强的Korn Shell,
ksh93
/usr/bin/ksh93
),它有更多的铃铛和哨子。在这种情况下,正是这些钟声和口哨让生活变得轻松:

KSH93:在KSH93中,您有一个shell变量
JOBMAX
,它为您执行以下操作:

JOBMAX
此变量定义一次可以运行的最大后台作业数。当达到此限制时,shell将在开始新作业之前等待作业完成

顺便说一句,您可能对使用for循环感兴趣

JOBMAX=5
for i in $(seq 1 50); do perl some_script.pl "$i" &; done

<强> KSH:如果不能使用KSH99并必须遵守POSIX 2兼容的KSH,则可以考虑使用<代码> XARG,但仅当它允许<代码> -max PROS FLAG。

seq 1 50 | xargs -I{} --max-procs=5 perl some_script.pl {}
可悲的是

所以,你必须自己建造一些东西:

procmax=5
for i in $(seq 1 50); do
   perl some_script.pl "$i" &;
   (( i%procmax == 0 )) && wait
done
不幸的是,这并不是一个真正的并行版本,因为它要等到前5个进程完成后才能开始下一批5个进程

因此,您可以查看一下
作业
,并对其进行处理:

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

由于
睡眠
,这仍然不是完全并行的,但必须这样做。

顺便问一下,您知道您的AIX发行包是哪个版本的ksh吗?这不仅对添加答案的人很有帮助,而且对想知道答案适用于哪些其他操作系统的人也很有帮助。@charlesduff。对不起。我不知道有各种版本的ksh for AIX。我使用的是AIX7.2.0.0,我在谷歌上搜索了如何获得KornShell版本。我按下CTRL+ALT+V,得到了M-11/16/88f版本。是这样吗?谢谢如果您运行默认shell,那么您就有了ksh88。脚本的shebang是什么,如果不在脚本中运行它,
$SHELL--version
--version的输出是什么?version在当前kshBTW上似乎不是一个标志,您知道AIX发行包的ksh版本是什么吗?这不仅对添加答案的人很有帮助,而且对想知道答案适用于哪些其他操作系统的人也很有帮助。@charlesduff。对不起。我不知道有各种版本的ksh for AIX。我使用的是AIX7.2.0.0,我在谷歌上搜索了如何获得KornShell版本。我按下CTRL+ALT+V,得到了M-11/16/88f版本。是这样吗?谢谢如果您运行默认shell,那么您就有了ksh88。脚本的shebang是什么,如果您没有在脚本中运行它,
$SHELL--version
--version的输出是什么?version似乎不是当前kshI-trued JOBMAX上的标志,但似乎不起作用。所有进程都在后台同时运行。我将代码修改为JOBMAX=3i=1;而[[$i-le 6]];做一些perl_script.pl$i&;((i+=1));完成;。这是否与之前询问的ksh版本有关?此外,for循环无法工作,因为它无法找到seq。是的,我相信是这样,您可以检查它是否与ksh93一起运行吗?我正在研究它,但是从IBM的手册来看,您的
ksh
似乎不支持这一点?您的
xarg
都不允许并行化。您是否安装了GNU工具包?(检查gxarg和gawk)@criz我想说的是:有趣的是,我实际上在做同一件事,但在继续下一件之前睡了2秒钟。但遗憾的是,我仍然不能使用seq。另外,我在while循环中使用了条件ps-fu$USER | grep some_script.pl | wc-l-ge$JOBMAX。很抱歉,我认为gxarg和gawk不可用。我尝试了JOBMAX,但似乎不起作用。所有进程都在后台同时运行。我将代码修改为JOBMAX=3i=1;而[[$i-le 6]];做一些perl_script.pl$i&;((i+=1));完成;。这是否与之前询问的ksh版本有关?此外,for循环无法工作,因为它无法找到seq。是的,我相信是这样,您可以检查它是否与ksh93一起运行吗?我正在研究它,但是从IBM的手册来看,您的
ksh
似乎不支持这一点?内