限制xargs将stdin读取到缓冲区

时间:2011-02-22 07:08:03

标签: bash pipe xargs

看起来xargs从stdin读取输入行,即使它已经运行了它可以运行的最大进程数。

以下是一个例子:

#!/bin/bash
function xTrigger()
{
   for ii in `seq 1 100`; do echo $ii; sleep 2; done
}
function xRunner()
{
   sleep 10;
   echo $1;
}
export -f xTrigger
export -f xRunner
bash -c "xTrigger" | xargs -n 1 -P 1 -i bash -c "xRunner {}"

开始上述过程后20秒,我killall xTrigger,但是xargs已经缓存了所有xTrigger打印的内容,因此xRunner继续打印1..10。我想要的是它只打印1,2

无论如何,我们可以改变这种行为,并且只有当它想要启动一个新命令时才让xargs从stdin中读取,这样xTrigger会在echo语句中等待,直到xargs从中读取它为止?我的标准输入具有非常动态的内容,因此这将非常有用。

试图坚持xargs只是因为它会稳定和优雅。只有在使用xargs没有简单的方法时才想编写额外的代码。

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

你不必杀死xTrigger()的Bash PID吗?

bash -c "echo $$; xTrigger" | xargs -n 1 -P 1 bash -c 'xRunner "$@"' _
kill -HUP <PID>

答案 1 :(得分:0)

在我的系统上,如果正在运行的其中一个作业以非零返回码退出,xargs将默认停止。因此,您应该将信号发送到运行XRunner的bash pid。

答案 2 :(得分:0)

只有在没有“bash -c xRunner”作业运行时,才能使xTrigger生成下一个触发器。现在很棒:

#!/bin/bash
function xTrigger()
{
   for ii in `seq 1 100`; do 
      echo $ii; 
      while [[ $(psgrep xRunner|grep -v xargs|wc -l) -ge 1 ]]; do
         sleep 2; 
      done
   done
}
function xRunner()
{
   sleep 10;
   echo $1;
}
export -f xTrigger
export -f xRunner
bash -c "xTrigger" | xargs -n 1 -P 1 -i bash -c "xRunner {}"