1

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

这是一个例子:

#!/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 秒后, I killall xTrigger,但 xargs 已缓冲 xTrigger 打印的所有内容,因此 xRunner 继续打印 1..10。我想要的是它只打印 1,2

无论如何我们可以改变这种行为并让 xargs 仅在它想要启动新命令时从 stdin 读取,以便 xTrigger 将在 echo 语句处等待直到 xargs 从中读取?我的标准输入有非常动态的内容,所以这将非常有用。

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

感谢你的帮助!

4

3 回答 3

0

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

bash -c "echo $$; xTrigger" | xargs -n 1 -P 1 bash -c 'xRunner "$@"' _
kill -HUP <PID>
于 2011-02-22T09:25:31.717 回答
0

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

于 2011-02-22T16:25:53.693 回答
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 {}"
于 2011-02-22T23:02:06.437 回答