Bash 限制xargs读取标准数据到缓冲区

Bash 限制xargs读取标准数据到缓冲区,bash,pipe,xargs,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

看起来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秒后,我
杀死了所有xTrigger
,因此xargs缓冲了xTrigger打印的所有内容,因此xRunner继续打印1..10。我想要的是它只打印1,2

我们是否可以改变这种行为,让xargs仅在stdin想要启动新命令时才从stdin读取,这样xTrigger就会在echo语句处等待,直到xargs从它读取?我的stdin有非常动态的内容,所以这将是非常有用的

试着坚持使用xargs,仅仅因为它稳定而优雅。如果没有简单的方法可以使用xargs编写额外的代码,那么您希望编写额外的代码


谢谢你的帮助

你不需要杀死xTrigger()的Bash-PID吗

bash-c“echo$;xTrigger”| xargs-n1-p1bash-c'xRunner“$@”_
杀戮

在我的系统上,如果xargs正在运行的某个作业以非零返回代码退出,则默认情况下xargs将停止。因此,您应该向运行XRunner的bash pid发送信号。

让xTrigger仅在没有运行“bash-c XRunner”作业时生成下一个触发器。现在效果很好:

#!/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 {}"

bash:xTrigger:command未找到
-您的函数未传递到子shell,是吗?xRunner也是如此。你为什么不做xTrigger | xargs-n1-p1-ixRunner?我们的观点是:不推荐使用Backticks,请改用
$(…)
,因为它可读性更好,独立性更好,并且易于嵌套。最后:{1..100}中的ii的
更好,因为它是内置的,不需要外部程序seq。虽然我不知道你的主要问题的答案,但是猜猜:不,不会飞。应该怎么做?按参数?通过代码修改和重新编译?缓存不是xargs的核心思想吗?
xTrigger | xargs-n1-p1-iXrunner
也不起作用,因为管道启动子shell,是吗?所以你需要2个脚本,xTrigger.sh和xRunner.sh,而且无论如何都需要它,因为你不能用killall停止一个函数-可以吗?对不起,我忘了几行。编辑代码以修复它。这些是进程,使用进程以便我们可以杀死它们,而xargs不能启动进程,因此我们必须使用bash-c“functionname”oops。我的意思是xargs无法启动函数
xargs
如果右侧的进程阻塞,则无法知道左侧的进程已死亡。
#!/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 {}"