我正在使用AIX Korn shell来执行一个Perl脚本,该脚本接受1到50之间的数字参数并同时在后台运行它们.有没有办法像5那样限制后台进程?如果一个完成,执行下一个.我当前的代码只是在后台执行所有代码.
i=1; while [[ $i -le 50 ]]; do perl some_script.pl $i &; ((i+=1)); done;
Run Code Online (Sandbox Code Playgroud)
例如,如果2结束,则执行下一个6,依此类推.
KSH有各种版本.原始的Korn Shell ksh88是自版本4(/usr/bin/ksh)以来IBM AIX中的缺省shell .但他们也支持增强的Korn Shell,ksh93(/usr/bin/ksh93),它有更多的花里胡哨.在这种情况下,正是那些让生活变得轻松的花里胡哨的东西:
KSH93:在KSH93中,你有一个shell变量JOBMAX可以为你做这个:
JOBMAX:此变量定义一次可运行的最大运行后台作业数.达到此限制时,shell将在开始新作业之前等待作业完成.
JOBMAX=5
i=1; while [[ $i -le 50 ]]; do perl some_script.pl $i &; ((i+=1)); done;
Run Code Online (Sandbox Code Playgroud)
顺便说一句.您可能对使用for循环感兴趣.
JOBMAX=5
for i in $(seq 1 50); do perl some_script.pl "$i" &; done
Run Code Online (Sandbox Code Playgroud)
KSH:如果您不能使用KSH93并且必须坚持使用符合POSIX 2的KSH,您可以考虑使用xarg,但前提是它允许使用该--max-procs标志.
seq 1 50 | xargs -I{} --max-procs=5 perl some_script.pl {}
Run Code Online (Sandbox Code Playgroud)
遗憾的是,AIX不支持该--max-procs标志.
所以,你必须自己建立一些东西:
procmax=5
for i in $(seq 1 50); do
perl some_script.pl "$i" &;
(( i%procmax == 0 )) && wait
done
Run Code Online (Sandbox Code Playgroud)
不幸的是,这并不是真正的并行版本,因为它会等到前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
Run Code Online (Sandbox Code Playgroud)
由于这个原因,这仍然不完全平行sleep,但必须这样做.