看起来 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 的简单方法时才想编写额外的代码。
感谢你的帮助!